22

可能重复:
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显示编译错误 -

无法对类型参数 T 执行 instanceof 检查。请改用其擦除 Object >,因为更多的泛型类型信息将在运行时被擦除。

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

提前致谢。:)

4

5 回答 5

40

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

myClass.isAssignableFrom(obj.getClass())

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

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

于 2013-01-09T05:14:57.167 回答
11

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

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

于 2013-01-09T05:15:52.103 回答
4

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

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

于 2013-01-09T05:13:52.600 回答
4

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

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

于 2013-01-09T05:14:38.743 回答
2

泛型类型将在编译后被擦除(泛型用于编译时类型安全),并在编译后替换为最适用的类型。

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

obj instance String
于 2013-01-09T05:13:38.100 回答