Java 10 赋值Arrays.asList给var变量:AssertionError: Unexpected intersection type

体验了下Java 10的局部变量类型推断var。使用List.of()给var赋值。

List list1 = Arrays.asList(1, "a",10L);
var list2 = list1;

上面通过中间的list1再赋值给var,编译通过。但如果直接使用Arrays.asList()赋值给var,如:

var list3 = Arrays.asList(1, "a",10L);

报AssertionError:

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<?>> 
        at jdk.compiler/com.sun.tools.javac.jvm.ClassWriter.enterInner(ClassWriter.java:1043) 
        at jdk.compiler/com.sun.tools.javac.jvm.ClassWriter$CWSignatureGenerator.classReference(ClassWriter.java:312) 

原因:

这是java 10的bug,查看:https://bugs.openjdk.java.net/browse/JDK-8199910。现在这个bug已经修复。

解决方法:

1、javac编译不要使用-g

在IDEA禁用-g:

Settings → Build, Execution, Deployment → Compiler → Java Compiler → 去掉 "Generate Debugging Info"勾选
 

2、声明明确的类型,例如第一种情况的使用。

版权声明:著作权归作者所有。

相关推荐

MySQL设置会话变量:把查询结果赋值给变量

MySQL设置变量有两种方式:会话变量和存储过程变量。1、使用set或select直接赋值,变量名以@开头例如:set @var=1; 可以在一个会话的任何地方声明,作用域是整个会话,称为用户变量。2、以declare关键字声明的变量,只能在存储过程中使用,称为存储过程变量。例如: declare var1 int default 0; 主要用在存储过程中,或者是给存储传参数中。两者的区别是: 在

Java 10 var的使用及限制

在Java 10的众多特性里,局部变量的类型推断是比较受大家关注的特性之一。这里简单介绍下它的使用以及限制。在Java 7,声明一个列表我们会这样做:List<String> list = new ArrayList<String>(); Java 8/9可以改写为:List<String>&

Java 10:类型推断局部变量var

Java 10将新增特性:类型推断的局部变量声明var。java9以及之前的版本,声明一个局部变量需要显式声明它的类型。Java 10引入了新的变量声明关键词var,使用它不需要我们显式声明局部变量的类型,它会自动推断出局部变量的类型。Java 9示例:import java.util.*; public class Java9&nbs

Java 9:List.of()与Arrays.asList()的区别

Java 9新增了List.of的集合工程方法。它与Arrays.asList区别如下:1、Arrays.asList返回的是可变的列表,而List.of返回的是不可变的列表List<Integer> list = Arrays.asList(1, 2, null); list.set(3, 3); //&

TypeScript:变量声明之解构赋值

解构(Destructuring)是ES6新增的特性。数组和对象(Object)的一个作用是把一些值组合打包在一起。与之相对,解构就类似把数组里的值或对象的属性解包。使用解构赋值语法可以很简便地把数组的值或对象的属性赋值给单独的变量。语法var a, b, rest; [a, b] = [10, 20]; console.log