具有独立于generics类型的generics方法的原始类型

这是chrert的问题的后续问题Generic类与其他类型的Collection getter 。 如果您能为我的问题想出更好的标题,请随时编辑它:

下面的代码包含一个generics类GenericClass ,其返回类型为T的方法,另一个返回类型为Collection ,显然与T无关。

现在,如果我实例化一个原始GenericClass (我永远不会这样做,所以这个问题更像是一个理论问题,以帮助理解发生了什么)然后在增强的for循环中调用该方法将不起作用,因为所有generics类型信息使用原始类型时似乎迷路了。 但是,当在一个赋值中调用相同的方法时,它可以工作(它警告类型不安全,但它编译)。

在我看来,要么两者都行不通,要么两者都行不通。 我不明白为什么一个有效,另一个没有。 你有任何提示,或知道JLS的任何部分解释这种行为?

 public class GenericClass { T doSomething() { return null; } Collection 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 Collection coll = raw.getCollection(); for (String string : coll) { // works just fine } } } 

有一个相关的问题,连同这里接受的答案,解释了什么是相当不错的: 为什么这个通用的Java代码不能编译?

在第一种情况下, raw.getCollection()返回原始Collection 。 JLS 14.14.2指定增强for循环的类型检查:

如果Type(在FormalParameter生产中)是引用类型,则TargetType是Type; 否则,TargetType是I的类型参数的捕获转换的上限, 如果是raw则是Object的上限

(重点补充)

在第二种情况下,您明确地将原始类型分配给generics类型,允许使用类似正常的警告。