You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未指定泛型的List元素类型疑问:右侧指定Integer时el的类型

问题解答:var推断的静态类型 vs 运行时实际类型

书中的结论是正确的:el的编译时静态类型是Object,这和你测试的运行时结果并不冲突,核心原因在于Java泛型的原始类型特性:

  • 你声明的List list是原始类型(未指定泛型参数),Java编译器会忽略右侧ArrayList<Integer>的泛型信息,将list的元素在编译时统一视为Object类型。
  • var的类型推断完全基于编译时的静态上下文,for-each循环迭代原始类型List时,迭代器的next()方法返回值类型为Object,因此el被推断为Object类型。

你测试的el instanceof Integer返回true,是因为运行时列表中实际存储的元素是Integer实例——这是运行时的实际类型,和编译时的静态类型是两个独立的概念:编译时编译器把el当作Object处理,运行时它实际指向Integer对象,所以instanceof判断为true。

如果要让el的编译时类型为Integer,需要将列表声明为泛型类型:

List<Integer> list = new ArrayList<>();
for(var el: list)
    System.out.println(el);

此时var会根据List<Integer>的元素类型,正确推断el为Integer类型。

内容的提问来源于stack exchange,提问作者clorzs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:22:37