gpt4 book ai didi

java - 使用 Java 泛型错误

转载 作者:行者123 更新时间:2023-12-01 23:45:56 24 4
gpt4 key购买 nike

我有以下代码:

String test = "[{\"color\":\"red\"}]";
Class<? extends Base> baseObject = Base.class;
Collection<? extends Base> elements = new ArrayList<Base>();
if (test.startsWith("[")) {
elements.addAll(new ObjectMapper().readValue(test, Collection.class));
} else {
elements.add(new ObjectMapper().readValue(test, baseObject));
}

但是我继续

elements.addAll(new ObjectMapper().readValue(test, Collection.class));

编译警告:

The expression of type Collection needs unchecked conversion to conform to Collection<? extends capture#1-of ? extends Base>

对于 elements.add(new ObjectMapper().readValue(test, baseObject));

编译错误:

The method add(capture#2-of ? extends Base) in the type Collection<capture#2-of ? extends Base> is not applicable for the arguments (capture#3-of ? extends Base)

出了什么问题?

最佳答案

错误很容易解释。您的集合被定义为保存扩展Base的类的实例。 。 ObjectMapper.readValue定义如下:

public <T> T readValue(JsonParser jp, Class<T> valueType)

这意味着它返回指定为第二个参数的类的实例。如果第二个参数是 Collection.class此方法返回 Collection 。就Collection ,不是Collection<? extends Base>而不是Collection<Base> 。因此,java 编译器无法确定您是否会将包含正确对象的集合放入 elements 中。定义为Collection<? extends Base> 。此外,java语法不允许提供泛型作为参数类,即你不能调用 readValue(c, Collection<Base>.class) .

第二种情况比较复杂。 baseObject定义为Class<? extends Base>elements集合定义为Class<? extends Base>也。所以有什么问题。问题出在? 。问号的意思是“扩展 Base 的东西”。但在这两种情况下,这都是两个不同的“东西”。

解决方案可以是将集合的定义更改为 Class<Base>或者在两种情况下都使用一个类或方法通用参数,例如:

public <T extends Base> myMethod() {
Class<T> baseObject = Base.class;
Collection<T> elements = new ArrayList<T>();
elements.add(new ObjectMapper().readValue(test, baseObject));
}

现在都是baseObjectelements使用相同类型T这确实延伸了Base

关于java - 使用 Java 泛型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17047244/

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