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

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/

10-10 04:19