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

ton*_*oan 28 java arrays type-inference exception java-10

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

  1. 下面的代码在编译和运行时完美运行:

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

    var list3 = Arrays.asList(1L, 2.0F, "3");
    
    Run Code Online (Sandbox Code Playgroud)

    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和治疗list2以及list3相同.提前致谢.

Zhe*_*lov 24

这是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认同)

孙兴斌*_*孙兴斌 12

这是OpenJDK的一个错误,请参阅:

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

  • 我相信这也将在JDK 10中修复.如果他们不回溯这样一个关键的错误,那将是疯狂的. (8认同)
  • 谢谢大家,我确认它的工作原理是使用jshell和`java version"10"2018-03-20 Java(TM)SE Runtime Environment 18.3(build 10 + 46) (2认同)