可能重复:
Java的:INSTANCEOF和泛型
我试图写它蒙上了泛型列表,以特定类型的列表的功能。 请看下面的代码
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
呈现出编译错误-
无法执行instanceof检查对类型参数T使用,而不是它的擦除对象>,而不是因为进一步的泛型类型信息将在运行时被删除。
任何澄清或方式来获得期望的结果?
提前致谢。 :)
你不能做这种方式。 幸运的是,你已经有了Class<T>
参数,所以不是做
myClass.isAssignableFrom(obj.getClass())
这是否会返回true obj
是类myClass
或子类。
作为@ILMTitan指出(谢谢),你将需要检查obj == null
以避免潜在的NullPointerException异常,或使用myClass.isInstance(obj)
来代替。 无论是做你所需要的。
答案很简单:因为在Java类型参数就是用来编译器授予类型安全的东西。
在运行时,约泛型类型的类型信息被丢弃,因为类型擦除,但instanceof
是需要一个具体类型(不是一个类型的变量)工作运行时检查。
T
是一个参数化类型和存在的编译目的。 它在运行时不因为类型擦除的存在。
因此, obj instanceof T
是不合法的。
由于Java使用擦除,泛型类型不能用来核对。
要获得期望的结果,使用Class.isInstance()
泛型类型将被擦除后汇编(泛型是编译时类型安全),将与编译后最适用类型替换。
如果你想使这个编译,与具体类型,例如替代T.
obj instance String