为什么instanceof不能使用Generic?

可能重复:
Java:Instanceof和Generics

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

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

但是obj instanceof T显示编译错误 –

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

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

提前致谢。 🙂

你不能这样做。 幸运的是,你已经有了一个Class参数,所以相反

 myClass.isAssignableFrom(obj.getClass()) 

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

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

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

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

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

因此, obj instanceof T不合法。

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

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

编译后将删除generics类型(generics用于编译时类型安全),编译后将替换为最适用的类型。

如果你想进行编译,请用具体类型替换T,例如

 obj instance String