为什么在直接将 Arrays.asList() 分配给 var 时会出现 AssertionError?
Why am I getting an AssertionError when assigning Arrays.asList() to var directly?
我正在努力理解 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
视为相同。提前致谢。
这是 Java 10 编译器中的错误:https://bugs.openjdk.java.net/browse/JDK-8199910
它仅在使用 -g
标志调用 javac
时被复制。
可能的解决方法:
- 不要使用
-g
标志
- 如果你使用IDEA:设置→构建、执行、部署→编译器→Java编译器→取消勾选"Generate Debugging Info"
- 不要将
var
与交集类型一起使用(使用显式类型):
List<Object> list = Arrays.asList(1L, 2.0F, "3");
var list = Arrays.<Object> asList(1L, 2.0F, "3");
- 使用自带编译器的 Eclipse
更新:
错误已在 JDK 10.0.2 中修复。
这是openjdk的一个bug,见this:
Javac should skip non-denotable types in the LocalVariableTypeTable
attribute
我正在努力理解 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
视为相同。提前致谢。
这是 Java 10 编译器中的错误:https://bugs.openjdk.java.net/browse/JDK-8199910
它仅在使用 -g
标志调用 javac
时被复制。
可能的解决方法:
- 不要使用
-g
标志- 如果你使用IDEA:设置→构建、执行、部署→编译器→Java编译器→取消勾选"Generate Debugging Info"
- 不要将
var
与交集类型一起使用(使用显式类型):List<Object> list = Arrays.asList(1L, 2.0F, "3");
var list = Arrays.<Object> asList(1L, 2.0F, "3");
- 使用自带编译器的 Eclipse
更新:
错误已在 JDK 10.0.2 中修复。
这是openjdk的一个bug,见this:
Javac should skip non-denotable types in the LocalVariableTypeTable attribute