代码之家  ›  专栏  ›  技术社区  ›  Paul J. Lucas

为什么我会得到“instanceof的非法泛型类型”?

  •  33
  • Paul J. Lucas  · 技术社区  · 14 年前

    鉴于:

    public class C<T> {
        private class D {
            public boolean equals( Object o ) {
                if ( !(o instanceof D) )    // line 4
                    return false;
                D other = (D)o;             // line 6
                return i == other.i;
            }
            int i;
        }
    }
    

    我得到:

    C.java:4: illegal generic type for instanceof
              if ( !(o instanceof D) )
                                  ^
    

    我还收到了关于第6行的“未选中的演员表”警告。为什么?这个 o 一个泛型类型——它只是一个普通类型 Object . 如何正确实施 equals() 通过检查和强制转换 D ?

    注意:显然,这个代码示例是我实际代码的简化版本。真正的课程 C D 更大,而且 D 是一个 private 内部类 C 由其实现使用。

    真实的 D 是否使用泛型参数 T .

    4 回复  |  直到 8 年前
        1
  •  37
  •   Stephen C    8 年前

    D some.pkg.C<T>.D

    T

    instanceof D (D) C<String>.D C<Integer>.D true false ClassCastException

    C java.lang.Class<T> Class

    事实上 Object 宣布 类型 o 变量。实际对象很可能有其他类型,它是 那个 键入(如果是 D 例如)将被类型删除。

        2
  •  7
  •   Stefan Kendall    14 年前

    如果使内部类成为静态的,代码就可以很好地编译。

    前任:

    private static class D{...}
    

    here 为了区别。

    你也可以试试 o.getClass() != D.class

        3
  •  7
  •   newacct    12 年前

    D C<T>.D

    if ( !(o instanceof C.D) )
    

    if ( !(o instanceof C<?>.D) )
    
        4
  •  5
  •   jederik    12 年前
    D.class.isInstance(o)