为什么java的新功能“instanceof运算符的模式匹配”在没有类型转换的情况下不能在列表集或映射上工作

Ujj*_*wal 3 java java-14

instanceof 甚至不适用于 List。例如

package org.practice;

import java.util.List;

public class InstanceOfDemo {

    public static void main(String[] args) {

        Employee emp1 = new Employee(1, "Ram", 10000);
        Employee emp2 = new Employee(2, "Shyam", 20000);
        Employee emp3 = new Employee(3, "Radha", 30000);

        Object obj = List.of(emp1, emp2, emp3);

        if (obj instanceof List empList) {
            for (Employee emp : empList) { //Type mismatch: cannot convert from element type Object to Employee
                System.out.println(emp.getId());
                System.out.println(emp.getName());
                System.out.println(emp.getSalary());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,instanceof 得到了 true,甚至声明了 empList 被创建了,但这并没有给开发人员带来任何好处,因为在 for 循环中,如果没有类型转换 as ,就无法使用 empList for (Employee emp : (List<Employee>)empList)。如果我们只进行类型转换,然后像传统代码一样对 obj 本身使用类型转换,那么这个功能有什么用。

Kay*_*man 5

因为Java 泛型中的类型擦除List导致它变成了原始类型,所以你只能从中获取 s 。Object

由于instanceof不适用于泛型(运行时与编译时),因此您只能获得任何泛型类的擦除版本,因此 anyFooClass<T>变为 aFooClass并且您需要像示例中那样进行未经检查的强制转换。

  • 实际上,“obj instanceof List empList”使用原始类型这一事实负责获取原始类型结果,而不是类型擦除。虽然类型擦除负责不允许在这里编写`obj instanceof List&lt;Employee&gt; empList`,但OP并没有明确是否已经尝试过这一点。 (5认同)