为什么在直接将Arrays.asList()分配给var时会出现AssertionError?

时间:2018-03-29 14:38:57

标签: java arrays exception type-inference java-10

我正在尝试理解Java 10中的local variable type inference

  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<?>>

  3. 我真的不明白为什么第二种情况是错误的但不是第一种情况。因为我希望编译器会推断出list1的类型,并将list2list3视为相同。提前谢谢。

2 个答案:

答案 0 :(得分:24)

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

仅在使用javac标志调用-g时才会重现。

可能的解决方法:

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

    该错误已在JDK 10.0.2修复。

答案 1 :(得分:12)

这是openjdk的错误,请参阅this

  

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