java非法类型_java – 为什么我得到“非法通用类型为instanceof”?

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实例)将被执行类型擦除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值