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

Java 17中instanceof模式匹配语法与运行原理及变量作用域咨询

Java 17代码分析与问题解答

测试代码

static void test(List<String> list) {
    System.out.println(list);
    if (!(list instanceof ArrayList<String> arrayList)) return;
    System.out.println(list == arrayList);
    arrayList.add("list");
    System.out.println(arrayList);
    System.out.println(list);
}

运行输出

[]
true
[list]
[list]

问题解答

1. 输出结果的产生过程

  • 第一行[]:调用test方法时传入的是一个空的ArrayList实例,第一行代码直接打印这个空列表,所以输出[]。
  • 第二行true:instanceof确认list是ArrayList<String>类型,同时将list指向的对象直接赋值给arrayList变量。因为两者指向同一个对象,用==比较引用地址自然返回true。
  • 第三行[list]:通过arrayList调用add方法给列表添加了元素"list",打印arrayList就会显示更新后的列表内容。
  • 第四行[list]:list和arrayList是同一个对象的两个引用,对象内容被修改后,打印list当然也会显示最新的列表状态。

2. list instanceof ArrayList<String> arrayList的变量作用域逻辑

这是Java 16开始支持的模式匹配增强语法,当instanceof判断成立时,会自动把list强转为ArrayList<String>类型,并存入arrayList变量中。

这个变量并非整个方法都能访问,而是从判断成功的分支开始,所有后续会执行的代码都可使用。这段代码里用了if (!(...)) return;——意思是只要判断不成立,方法直接退出,后面的代码根本不会执行。编译器能确定,只要执行到if语句之后的代码,arrayList一定是已经初始化完成的,所以允许在后续代码中直接使用这个变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:07:22