为什么 instanceof 不能与 Generic 一起使用?

2022-09-02 00:14:10

可能的重复:
Java:实例和泛型

我正在尝试编写一个函数,该函数将泛型List转换为特定类型的List。在下面找到代码

public <T>List<T> castCollection(List srcList, Class<T> clas){
    List<T> list =new ArrayList<T>();
    for (Object obj : srcList) {
       if(obj instanceof T){
            ...
       }
    }
    return list;
}

但显示编译错误 -obj instanceof T

无法对类型参数 T 执行实例检查。请改用其擦除对象 >相反,因为将在运行时擦除其他泛型类型信息。

任何澄清或获得所需结果的方法?

提前致谢。:)


答案 1

你不能这样做。幸运的是,你已经有了一个论点,所以相反Class<T>

myClass.isAssignableFrom(obj.getClass())

如果 是类或子类,这将返回 true。objmyClass

正如@ILMTitan指出的那样(谢谢),您需要检查以避免潜在的NullPointerException,或者改用。两者都做你需要的。obj == nullmyClass.isInstance(obj)


答案 2

简短的回答:因为Java中的类型参数只是编译器用来授予类型安全性的东西。

在运行时,有关泛型类型的类型信息会因类型擦除而被丢弃,但这是一种运行时检查,需要具体类型(而不是类型变量)才能工作。instanceof