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

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

下面的代码包含一个带有返回类型T的方法的泛型类GenericClass<T> ,以及返回类型为Collection<String>另一个方法,这显然与T无关。

现在,如果我实例化一个原始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代码?


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

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

(强调加)

在第二种情况下,你明确地将一个原始类型分配给一个泛型类型,这可以使用正常的警告。

链接地址: http://www.djcxy.com/p/71613.html

上一篇: Raw types with generic methods independent of the generic type

下一篇: Org.json.JSONException: Unterminated string at character 1834