为什么在将 Arrays.asList() 直接分配给 var 时,我会得到一个 AssertionError?

我试图理解Java 10中的局部变量类型推断

  1. 下面的代码在编译和运行时可以完美地工作:

    List list1 = Arrays.asList(1L, 2.0F, "3");
    var list2 = list1;
    
  2. 但是,此行会引发编译错误:

    var list3 = Arrays.asList(1L, 2.0F, "3");
    

    Error:java: java.lang.AssertionError: Unexpected intersection type: java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>

我真的不明白为什么第2种情况是错误的,而不是第1种情况。因为我希望编译器会推断出的类型和对待和相同。提前致谢。list1list2list3


答案 1

这是Java 10编译器中的一个错误:https://bugs.openjdk.java.net/browse/JDK-8199910

仅当使用标志调用时,才会复制它。javac-g

可能的解决方法:

  1. 不要使用标志-g
    • 如果使用 IDEA:“设置”→“生成”、“执行”、“部署→编译器”→ Java 编译器,→取消选中“生成调试信息”
  2. 不要与交集类型一起使用(使用显式类型):var
    • List<Object> list = Arrays.asList(1L, 2.0F, "3");
    • var list = Arrays.<Object> asList(1L, 2.0F, "3");
  3. 使用具有自己编译器的 Eclipse

UDPATE:

该错误已在 JDK 10.0.2 中修复。


答案 2

这是 openjdk 的一个错误,请参阅以下内容

Javac 应该跳过 LocalVariableTypeTable 属性中的非可识别类型