为什么会出现“ instanceof的非法泛型类型”?
鉴于:
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
。
回答:
o不是通用类型-只是普通对象。
那不是问题。问题…和两个编译错误的根本原因…是D
泛型类。它是泛型的,因为它是泛型类中的非静态嵌套类。其完全限定名称为some.pkg.C<T>.D
。
仅供参考:实数D确实使用了通用参数T。
而事实上,它 可以 利用的T
是什么使D
一个通用类。
您无法使用instanceof
D或(D)
通用类型擦除的原因。基本上,运行时无法区分(say)C<String>.D
和的类型C<Integer>.D
。并且由于无法做到这一点,因此无法确定是否instanceof
D应该返回true
,false
或者是否(D)
应该成功或抛出ClassCastException
。
一种解决方案是将其声明D
为静态。但这不适用于您的“实数D”,因为静态类无法使用封闭类中的泛型类型参数。您的“ FYI”表示这样做。
另一种解决方案是实例化外部类C
传递给它的实际类型的T
作为java.lang.Class<T>
实例。然后使用该Class
实例来实现运行时类型检查并根据需要进行强制转换。这很可能是混乱的。
第三种解决方案是 仔细 分析代码,并确定@SuppressWarning注释是否安全,以禁止显示“不安全的强制转换”等警告。
什么类型的擦除?“ o”直接是对象类型。
实际上Object
是变量的 声明 类型o
。实际对象很可能具有其他类型,并且正是 该 类型(D
例如,如果是实例)将经受类型擦除。
以上是 为什么会出现“ instanceof的非法泛型类型”? 的全部内容, 来源链接: utcz.com/qa/411036.html