为什么的instanceof不能与通用工作? [重复](why instanceof does

2019-08-06 03:32发布

可能重复:
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使用,而不是它的擦除对象>,而不是因为进一步的泛型类型信息将在运行时被删除。

任何澄清或方式来获得期望的结果?

提前致谢。 :)

Answer 1:

你不能做这种方式。 幸运的是,你已经有了Class<T>参数,所以不是做

myClass.isAssignableFrom(obj.getClass())

这是否会返回true obj是类myClass或子类。

作为@ILMTitan指出(谢谢),你将需要检查obj == null以避免潜在的NullPointerException异常,或使用myClass.isInstance(obj)来代替。 无论是做你所需要的。



Answer 2:

答案很简单:因为在Java类型参数就是用来编译器授予类型安全的东西。

在运行时,约泛型类型的类型信息被丢弃,因为类型擦除,但instanceof是需要一个具体类型(不是一个类型的变量)工作运行时检查。



Answer 3:

T是一个参数化类型和存在的编译目的。 它在运行时不因为类型擦除的存在。

因此, obj instanceof T是不合法的。



Answer 4:

由于Java使用擦除,泛型类型不能用来核对。

要获得期望的结果,使用Class.isInstance()



Answer 5:

泛型类型将被擦除后汇编(泛型是编译时类型安全),将与编译后最适用类型替换。

如果你想使这个编译,与具体类型,例如替代T.

obj instance String


文章来源: why instanceof does not work with Generic? [duplicate]