这是chrert的问题Generic classes with Collection getter of other types的后续。如果您能为我的问题想出一个更好的标题,请随时对其进行编辑:
以下代码包含一个GenericClass<T>
具有返回类型的方法的泛型类T
和另一个具有返回类型的方法Collection<String>
,这显然独立于T
.
现在,如果我实例化一个 raw GenericClass
(我永远不会这样做,所以这个问题更多是一个理论问题,以帮助理解发生了什么)然后在增强的 for 循环中调用该方法将不起作用,因为所有泛型类型信息似乎在使用原始类型时迷路。但是,当在赋值中调用相同的方法时,它可以工作(它会警告类型不安全,但它会编译)。
在我看来,要么两者都不应该工作,要么两者都应该工作。我不明白为什么一个有效,而另一个无效。您是否有任何提示,或知道解释此行为的 JLS 的任何部分?
public class GenericClass<T> {
T doSomething() {
return null;
}
Collection<String> getCollection() {
return Collections.emptyList();
}
public static void main(String[] args) {
GenericClass raw = new GenericClass();
// This will not compile (Error message below)
for (String str : raw.getCollection()) {
// Type mismatch: cannot convert from element type Object to String
}
// This is only a warning:
// Type safety: The expression of type Collection needs unchecked conversion to conform to Collection<String>
Collection<String> coll = raw.getCollection();
for (String string : coll) {
// works just fine
}
}
}
有一个相关的问题,连同这里接受的答案,很好地解释了发生了什么:为什么这个通用的 java 代码不能编译?