考虑以下具有非静态内部类的泛型类
方法
类
为了理解警告,我尝试构建一个使用情况,在其中调用
所以我想,没有理由在
由于方法重写发生在
Eclipse编译器警告如下:
Base<ID>
。public class Base<ID> {
ID id;
public Base(ID id) {
this.id = id;
}
public ID getId() {
return id;
}
protected class BaseInner {
String text = "Inner";
}
protected void method(BaseInner o) {
o.text = "Foo";
}
}
方法
Base.method
需要一个类型为BaseInner
的参数。现在考虑以下派生类。public class Sub<ID> extends Base<ID> {
public Sub(ID id) {
super(id);
}
@Override
protected void method(BaseInner o) {
if (o instanceof Sub.SubInner) {
SubInner sub = (SubInner) o; // Why does this cast emit an "unchecked cast" warning
sub.text = "Bar";
sub.value = 1337;
}
}
protected class SubInner extends BaseInner {
Number value = 42;
}
}
类
Sub
继承自Base
,内部类SubInner
继承自内部类BaseInner
。泛型类型参数ID
作为类型参数传递给基类Base
。
我的问题:为什么编译器在Sub
的覆盖方法中从BaseInner
到SubInner
的强制转换会报错?为了理解警告,我尝试构建一个使用情况,在其中调用
Sub<A>
的method
与一些Sub<B>.SubInner
,以证明该警告的必要性。但是,如果类型不兼容,我所能想到的任何事情(包括? extends
和? super
)都会在方法调用时产生编译器错误。所以我想,没有理由在
method
中进行未检查的强制类型转换的警告。我错过了什么吗?由于方法重写发生在
Sub<ID>
实现中,编译器能够推断出SubInner
的泛型类型为Sub<ID>.SubInner
。因此,这个问题不是重复的!Eclipse编译器警告如下:
如果我在方法参数中使用类型安全性: 从Base<ID>.BaseInner到Sub<ID>.SubInner的未检查转换
Base<ID>.BaseInner
,或者在强制转换表达式中使用Sub<ID>.SubInner
,则警告不会改变。
o instanceof Sub.SubInner
,那么在下面的语句中您也应该使用Sub.SubInner
,对吗? - nbroSub<ID>.SubInner
进行转换,但是它总是产生相同的警告。 - niksSubInner
!(不需要额外限定泛型类型,如Sub<ID>.SubInner
) - niks