为什么instanceof不能使用Generic?

Sub*_*der 20 java generics instanceof typeerror

可能重复:
Java:Instanceof和Generics

我正在尝试编写一个将通用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;
}
Run Code Online (Sandbox Code Playgroud)

obj instanceof T显示编译错误 -

无法对类型参数T执行instanceof检查.请改为使用其擦除对象>,因为将在运行时擦除其他泛型类型信息.

任何澄清或获得预期结果的方法?

提前致谢.:)

Jim*_*son 38

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

myClass.isAssignableFrom(obj.getClass())
Run Code Online (Sandbox Code Playgroud)

如果obj是类myClass或子类,则返回true .

正如@ILMTitan指出的那样(感谢),您需要检查obj == null以避免潜在的NullPointerException,或者使用myClass.isInstance(obj).要么做你需要的.

  • 这可能导致obj的空指针为"null".`isInstance()`不会导致空指针问题. (5认同)

Jac*_*ack 9

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

在运行时,由于类型擦除而丢弃有关泛型类型的类型信息,但是instanceof运行时检查需要具体类型(不是类型变量)才能工作.