假设我有以下域模型,为说明起见,我对其进行了一些简化。
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>
if。从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/