gpt4 book ai didi

java - 如何重用泛型类而不收到编译器警告

转载 作者:行者123 更新时间:2023-11-30 02:23:33 24 4
gpt4 key购买 nike

假设我有以下域模型,为了说明目的我对其进行了一些简化。

public abstract class JsonSerializer<T> {

public abstract JsonElement toJsonElement(final T object, final Locale locale);

public JsonArray toJsonArray(final Collection<T> objects, final Locale locale) {
return objects.stream().map(t -> toJsonElement(t, locale)).collect(JsonArray::new, JsonArray::add, JsonArray::addAll);
}
}

public class FruitJsonSerializer<T extends Fruit> implements JsonSerializer<T> {}

public abstract class Fruit {}

public class Banana extends Fruit {}

public class Apple extends Fruit {}

然后,当我想序列化任何水果时,我会这样做:

FruitJsonSerializer serializer = new FruitJsonSerializer();
serializer.toJsonElement(new Banana());
serializer.toJsonElement(new Apple());

但是我收到编译器的警告,说这是对作为原始类型成员的“toJsonElement”的未经检查的调用。

如果每个实现都没有一个序列化器声明( FruitJsonSerializer<Apple>FruitJsonSerializer<Banana> 等),如何避免此警告?

最佳答案

通用参数应该是具体类,而不是类的子集。您可以声明JsonSerializer<Apple>JsonSerializer<Banana> 。如果没有参数,它被视为 JsonSerializer<Fruit> .

如果您不想制作 FruitJsonSerializer通用则不应该写 FruitJsonSerializer<T extends Fruit>如果。从 JsonSerializer<Fruit> 继承就足够了。这是我的变体:

public static interface JsonSerializer<T> {
JsonElement toJsonElement(final T object);
JsonArray toJsonArray(final Collection<? extends T> objects, Locale locale);
}

public static class FruitJsonSerializer implements JsonSerializer<Fruit> {}

请注意,通配符用于 Collection<? extends T> 的通用参数.

关于java - 如何重用泛型类而不收到编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46220332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com