为什么instanceof不能使用Generic?

时间:2013-01-09 05:11:32

标签: java generics typeerror instanceof

  

可能重复:
  Java: Instanceof and 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;
}

obj instanceof T显示编译错误 -

  

无法对类型参数T执行instanceof检查。请改为使用其擦除对象&gt;而是在运行时擦除其他泛型类型信息。

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

提前致谢。 :)

5 个答案:

答案 0 :(得分:37)

你不能这样做。幸运的是,你已经有一个Class<T>参数,所以改为

myClass.isAssignableFrom(obj.getClass())

如果obj属于类myClass或子类。

,则返回true

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:4)

T是参数化类型,存在用于编译目的。由于类型擦除,它在运行时不存在。

因此,obj instanceof T不合法。

答案 3 :(得分:4)

因为java使用擦除,所以不能使用泛型类型进行检查。

要获得所需结果,请使用Class.isInstance()

答案 4 :(得分:2)

编译后通用类型为erased(泛型用于编译时类型安全),编译后将替换为最适用的类型。

如果要进行编译,请将T替换为具体类型,例如

obj instance String