为何直接将Arrays.asList()赋值给var会触发AssertionError?
Java 10 var类型推断搭配Arrays.asList的编译错误解析
咱们先拆解一下你碰到的这两种情况,核心问题出在编译器对泛型类型的自动推导上:
为什么var list2 = list1能正常编译?
当你写List list1 = Arrays.asList(1L, 2.0F, "3")时,list1被声明为原始类型List(没有指定泛型参数),所以var推断list2的类型就是原始类型List——这个过程不需要编译器去推导复杂的泛型边界,自然不会触发错误。
为什么直接var list3 = Arrays.asList(1L, 2.0F, "3")会报错?
这里的关键是var要求编译器自动推导Arrays.asList的泛型参数<T>。你传入的三个参数类型分别是Long、Float、String,它们的共同超类型不只是Object,还同时实现了Serializable和Comparable接口。编译器会尝试生成一个嵌套的交集类型:Object & Serializable & Comparable<? extends Object & Serializable & Comparable<?>>。
而早期的Java 10 javac编译器在处理这种嵌套的复杂交集类型时,触发了内部的断言错误——也就是你看到的Error:java: java.lang.AssertionError: Unexpected intersection type,这属于特定版本编译器的bug,不是var本身的设计问题。
解决方法
给你几个可行的处理方案:
- 显式指定泛型类型:直接告诉编译器
Arrays.asList的泛型参数,跳过自动推导:var list3 = Arrays.asList<Object>(1L, 2.0F, "3"); - 升级JDK版本:这个断言错误在Java 10的后续更新补丁,以及Java 11及以上版本中已经被修复,升级后就能正常编译。
- 用变量过渡:像你第一个例子那样,先声明一个带显式类型(或原始类型)的变量接收结果,再用
var赋值。
内容的提问来源于stack exchange,提问作者hoan
相关产品推荐
相关产品推荐

