The o is not a generic type — it’s just a plain Object.
这不是问题。问题…和编译错误的根本原因…是D是一个泛型类。它是泛型的,因为它是泛型类中的非静态嵌套类。其完全限定名称将为some.pkg.C< T> .D。
FYI: The real D does make use of the generic parameter T.
而且它可以利用T的事实是使D成为通用类。
您不能使用instanceof D或(D)的原因是通用类型擦除。基本上,运行时间不能区分(例如)C< String> .D和C< Integer> .D的类型。由于它不能这样做,它不能确定instanceof D应该返回true还是false,或者(D)应该成功或者抛出ClassCastException。
一个解决方案是将D声明为静态。但是,由于静态类不能使用封闭类的通用类型参数,因此它不会与您的“真实D”一起使用。你的“FYI”表示这样做。
另一个解决方案是实例化外部类C,将实际的T类型作为java.lang.Class< T>实例。然后使用此Class实例根据需要实现运行时类型检查和转换。这可能是凌乱的。
第三个解决方案是仔细分析代码,并确定@SuppressWarning注释是否安全,以抑制“不安全的转换”等警告。
What type erasure? ‘o’ is of type Object directly.
实际上Object是o变量的声明类型。实际的对象很可能有一些其他的类型,它的类型(如果它是一个D实例)将被执行类型擦除。