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
相关产品推荐
相关产品推荐

