我正在尝试理解Java 10中的local variable type inference。
以下代码在编译和运行时完美运行:
List list1 = Arrays.asList(1L, 2.0F, "3");
var list2 = list1;
但是,此行会引发编译错误:
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
的类型,并将list2
和list3
视为相同。提前谢谢。
答案 0 :(得分:24)
这是Java 10编译器中的错误:https://bugs.openjdk.java.net/browse/JDK-8199910
仅在使用javac
标志调用-g
时才会重现。
可能的解决方法:
-g
标志
var
与交集类型一起使用(使用显式类型):
List<Object> list = Arrays.asList(1L, 2.0F, "3");
var list = Arrays.<Object> asList(1L, 2.0F, "3");
该错误已在JDK 10.0.2修复。
答案 1 :(得分:12)
这是openjdk的错误,请参阅this:
Javac应该跳过LocalVariableTypeTable中的不可表示的类型 属性