为什么会出现“ 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

注意:显然,此代码示例是我的实际代码的简化版本。真正的类CD都大得多,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应该返回truefalse或者是否(D)应该成功或抛出ClassCastException

一种解决方案是将其声明D为静态。但这不适用于您的“实数D”,因为静态类无法使用封闭类中的泛型类型参数。您的“ FYI”表示这样做。

另一种解决方案是实例化外部类C传递给它的实际类型的T作为java.lang.Class<T>实例。然后使用该Class实例来实现运行时类型检查并根据需要进行强制转换。这很可能是混乱的。

第三种解决方案是 仔细 分析代码,并确定@SuppressWarning注释是否安全,以禁止显示“不安全的强制转换”等警告。

什么类型的擦除?“ o”直接是对象类型。

实际上Object是变量的 声明 类型o。实际对象很可能具有其他类型,并且正是 类型(D例如,如果是实例)将经受类型擦除。

以上是 为什么会出现“ instanceof的非法泛型类型”? 的全部内容, 来源链接: utcz.com/qa/411036.html

回到顶部