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



