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

Java 具有独立于泛型类型的泛型方法的原始类型,java,generics,Java,Generics,这是对奥巴马问题的跟进。如果您能为我的问题提供更好的标题,请随意编辑: 下面的代码包含一个泛型类GenericClass,其返回类型为T,另一个返回类型为Collection,显然独立于T 现在,如果我实例化一个原始的泛型类(我永远不会这样做,所以这个问题更像是一个理论问题,以帮助理解发生了什么),那么在增强的for循环中调用该方法将不起作用,因为在使用原始类型时,所有泛型类型信息似乎都会丢失。但是,当在赋值中调用相同的方法时,它会工作(它会警告类型不安全,但会编译) 在我看来,要么两者都不应该

这是对奥巴马问题的跟进。如果您能为我的问题提供更好的标题,请随意编辑:

下面的代码包含一个泛型类
GenericClass
,其返回类型为
T
,另一个返回类型为
Collection
,显然独立于
T

现在,如果我实例化一个原始的
泛型类
(我永远不会这样做,所以这个问题更像是一个理论问题,以帮助理解发生了什么),那么在增强的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
        }
    }
}
公共类GenericClass{
T doSomething(){
返回null;
}
集合getCollection(){
返回集合。emptyList();
}
公共静态void main(字符串[]args){
GenericClass原始=新的GenericClass();
//这将不会编译(下面的错误消息)
for(字符串str:raw.getCollection()){
//类型不匹配:无法从元素类型对象转换为字符串
}
//这只是一个警告:
//类型安全:类型集合的表达式需要未经检查的转换才能符合集合
Collection coll=raw.getCollection();
for(字符串:coll){
//很好用
}
}
}


有一个相关的问题,连同这里被接受的答案,很好地解释了发生了什么:

在第一种情况下,
raw.getCollection()
返回一个raw
集合。指定增强的
for
循环的类型检查:

如果Type(在FormalParameter产品中)是引用类型,那么TargetType是Type;否则,TargetType是I、或Object(如果I为原始)类型参数的捕获转换的上限。

(增加重点)


在第二种情况下,您显式地将一个原始类型分配给泛型类型,这是允许的,并带有一个类似于正常的警告。

第二种情况的强调和解释非常清楚。非常感谢。