【问题标题】:why instanceof does not work with Generic? [duplicate]为什么 instanceof 不适用于 Generic? [复制]
【发布时间】:2012-12-23 02:40:57
【问题描述】:

可能重复:
Java: Instanceof and Generics

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

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 >,因为更多的泛型类型信息将在运行时被擦除。

任何澄清或获得所需结果的方法?

提前致谢。 :)

【问题讨论】:

标签: java generics typeerror instanceof


【解决方案1】:

你不能这样做。幸运的是,您已经有了 Class&lt;T&gt; 参数,所以改为这样做

myClass.isAssignableFrom(obj.getClass())

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

正如@ILMTitan 指出的(谢谢),您需要检查obj == null 以避免潜在的NullPointerException,或者改用myClass.isInstance(obj)。两者都能满足您的需求。

【讨论】:

  • 那会导致obj的空指针是nullisInstance() 不会导致空指针问题。
  • 另请注意,即使obj“可以转换为”myClassisAssignableFrom() 也会返回 true。首选isInstance(),如果obj“是表示类(或其任何子类)的实例”,则返回true
【解决方案2】:

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

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

【讨论】:

  • 是否有 instanceof 模拟在编译时检查?就我而言,我试图将ClassCastException 作为我对Queueadd 方法定义的一部分。我的第一个想法是instanceof,但在编译过程中我得到了error: illegal generic type for instanceof
  • @Ungeheuer 你应该绑定你的类型变量。
【解决方案3】:

由于 java 使用擦除,泛型类型不能用于检查。

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      obj instance String
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多