有这样一种方法:
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]
请解释一下这是怎么可能的?
这段代码如何创建另一个在整个方法中可用的对象(arrayList)?:list instanceof ArrayList<String> arrayList
17. hello
1条答案
按热度按时间f1tvaqid1#
这个特性被称为 * 模式匹配 *,是在Java 14中引入的(参见JEP 305),并在Java 16中完成的(参见JEP 394)。
像
if (list instanceof ArrayList<String> a) { ... }
这样的语句会检查list
变量是否是ArrayList
类型的示例,如果是,则将其值赋给a
。现在a
在if分支中可用。没有模式匹配功能的等效代码看起来像这样:
编译器检查if语句的条件,以确保模式匹配变量在正确的范围内可用。例如,您的代码包含了
instanceof
运算符结果的求反(使用!
):现在编译器从
// Rest of the code
行推断出list
* 必须 * 是ArrayList<Integer>
类型,因此变量arrayList
在此范围内。更多信息