Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要对列表进行常规强制转换<;?扩展集..>;列出<;设置..>;在Sun JDK 6上成功,但在Oracle JDK 7上编译失败?_Java_Generics_Java 7 - Fatal编程技术网

Java 为什么要对列表进行常规强制转换<;?扩展集..>;列出<;设置..>;在Sun JDK 6上成功,但在Oracle JDK 7上编译失败?

Java 为什么要对列表进行常规强制转换<;?扩展集..>;列出<;设置..>;在Sun JDK 6上成功,但在Oracle JDK 7上编译失败?,java,generics,java-7,Java,Generics,Java 7,下面的代码 class GenericCompilationFailureDemo { List<? extends GenericCompilationFailureDemo> newList() { return new ArrayList<GenericCompilationFailureDemo>(); }; void useList() { List<GenericCompilationFail

下面的代码

class GenericCompilationFailureDemo {
    List<? extends GenericCompilationFailureDemo> newList() { 
        return new ArrayList<GenericCompilationFailureDemo>(); 
    };

    void useList() {
        List<GenericCompilationFailureDemo> list = 
            (List<GenericCompilationFailureDemo>) newList();
    }  

    List<? extends Set<GenericCompilationFailureDemo>> newListOfSpecificSets() { 
        return new ArrayList<Set<GenericCompilationFailureDemo>>(); 
    };

    void useListOfSpecificSets() {
        List<Set<GenericCompilationFailureDemo>> listOfSpecificSets = 
            (List<Set<GenericCompilationFailureDemo>>) newListOfSpecificSets();
    } 

    List<? extends Set<? extends GenericCompilationFailureDemo>> newListOfSets() { 
        return new ArrayList<Set<? extends GenericCompilationFailureDemo>>(); 
    };

    void useListOfSet() {
        List<Set<? extends GenericCompilationFailureDemo>> listOfSets = 
            (List<Set<? extends GenericCompilationFailureDemo>>) newListOfSets();
    }  
}
请注意,
useList
useListOfSpecificSets
中的前两个“扩展到特定类型”强制转换在1.7.001下仍然成功,因此它似乎与“双泛型扩展”有关

是否知道在6和7之间可能发生了什么变化,以及观察到的行为是否符合规范或bug

根据Sanjay的评论编辑:

@桑杰:啊哈,有趣!这里是
java-version
的输出:

java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
这里是
javac GenericCompilationFailureDemo.java的结果(与上面的代码相同,带有List、ArrayList和Set的导入语句):

genericcomilationfailuredemo.java:30:错误:不可转换类型

(列表这显然是一个javac7错误。根据强制转换规则[1]应该允许它

其中一条规则允许缩小引用转换…然后是未经检查的转换

铸造
列表


[2]

值得一提的是,这段代码是在我的JDK 7上编译的。你能把
java-version
命令的全部输出与“build”一起发布吗字符串?请粘贴准确的编译错误+sanjay建议的内容。我相信在某些情况下,泛型在java 7中应该更简单一些……也许您发现了一种情况,旧的、复杂的JDK 6语法破坏了新的编译器。@sanjay:啊哈,很有意思!请参阅编辑后的问题,以获得对您的评论的答复有一个坏习惯,即自发地拒绝根据JLS合法的泛型强制转换,请参阅,尤其是这里提到的大量相关bug列表(截至目前为止为16个)-您的可能在这个列表中:)您可以通过显式list=>list=>list绕过它)我确实验证了这一点-但是“黑客攻击泛型”这不是我真正想做的事;-)谢谢你的解释!您建议Oracle内部是否有人联系(例如编译器开发人员列表等),看看是否值得为此提交一个bug?刚刚发布到compiler-dev。想知道我们会得到什么样的响应;-)@AndrewPhillips嘿,你能告诉我们这个回答吗:)我很好奇看到这个没有黑客攻击的解决方案。
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
GenericCompilationFailureDemo.java:30: error: inconvertible types
            (List<Set<? extends GenericCompilationFailureDemo>>) newListOfSets()
;
                                                                              ^
  required: List<Set<? extends GenericCompilationFailureDemo>>
  found:    List<CAP#1>
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Set<? extends GenericCompilationFailureDemo> from capture of ?
 extends Set<? extends GenericCompilationFailureDemo>
Note: GenericCompilationFailureDemo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
List<A> => List   // narrowing reference conversion
List => List<B>   // unchecked conversion