Java 如何在不获得编译器警告的情况下重用泛型类
假设我有下面的域模型,为了便于说明,我对其进行了一点简化Java 如何在不获得编译器警告的情况下重用泛型类,java,generics,Java,Generics,假设我有下面的域模型,为了便于说明,我对其进行了一点简化 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
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 {}
但是我从编译器那里得到一个警告,说这是对作为原始类型成员的“ToJSoneElement”的未经检查的调用
如何在每个实现没有一个序列化程序声明的情况下避免此警告(
FruitJsonSerializer
,FruitJsonSerializer
等)?您可以使用?通配符
FruitJsonSerializer<? super Fruit> serializer = new FruitJsonSerializer<>();
FruitJsonSerializer泛型参数应该是一个具体的类,而不是类的子集。您可以声明JsonSerializer
或JsonSerializer
。如果没有参数,它将被视为JsonSerializer
如果您不想使FruitJsonSerializer
generic,那么不应该编写FruitJsonSerializer
If。从JsonSerializer
继承它就足够了。这是我的变体:
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> {}
公共静态接口JsonSerializer{
JsonElement到JsonElement(最终的T对象);
JsonArray到JsonArray(最终集合如果
- 类A可以使用基类或接口B处理多种不同的对象类型
- 您希望将某些A实例的可用性限制为特定的B子类
例如,List
可以处理所有的Object
子类,List
通过编译器类型检查限制为String
元素,从而避免了某些类型的细微错误
您的JsonSerializer
是一个调用泛型的有效示例。但是我对fructjsonserializer
有疑问
我建议从FrootJSonSerializer中删除类型参数:
public class FruitJsonSerializer implements JsonSerializer<Fruit> {}
否则,您将无法将列表
传递给JsonSerializer
那么JsonSerializer
呢?它将不会编译,因为toJsonElement期望的水果集合与Banana的集合不兼容,例如,当使用toJsonArray时,它不会编译,因为列表不兼容非常感谢您的时间Zefick。但这不会编译。我将编辑我的问题,提供更多关于JsonSerializer实现的详细信息。
public class FruitJsonSerializer implements JsonSerializer<Fruit> {}
FruitJsonSerializer<Fruit> generalSerializer = new FruitJsonSerializer<>();
FruitJsonSerializer<Apple> applesSerializer = new FruitJsonSerializer<>();
JsonArray toJsonArray(final Collection<? extends T> objects, final Locale);