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);