为什么直接将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>

我真的不明白为什么第二种情况是错误的但不是第一种情况。 因为我希望编译器可以推断出list1的类型,并且对list2list3进行相同的处理。 提前致谢。

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

只有在使用-g标志调用javac时才会重现它。

可能的解决方法:

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

UDPATE:

该错误已在JDK 10.0.2中修复。

这是openjdk的一个错误,请看:

Javac应跳过LocalVariableTypeTable属性中的不可表示的类型