Java instance of magic

utugiqy6  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(115)

有这样一种方法:

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

f1tvaqid

f1tvaqid1#

这个特性被称为 * 模式匹配 *,是在Java 14中引入的(参见JEP 305),并在Java 16中完成的(参见JEP 394)。
if (list instanceof ArrayList<String> a) { ... }这样的语句会检查list变量是否是ArrayList类型的示例,如果是,则将其值赋给a。现在a在if分支中可用。
没有模式匹配功能的等效代码看起来像这样:

if (list instanceof ArrayList) {
    ArrayList<String> a = (ArrayList<String>) list;
    // do something with a
}

编译器检查if语句的条件,以确保模式匹配变量在正确的范围内可用。例如,您的代码包含了instanceof运算符结果的求反(使用!):

if (!(list instanceof ArrayList<String> arrayList)) {
    return;
}
// Rest of the code

现在编译器从// Rest of the code行推断出list * 必须 * 是ArrayList<Integer>类型,因此变量arrayList在此范围内。

更多信息

相关问题