考虑以下通用类 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;
}
}
类(class)Sub
源自 Base
和内部类 SubInner
派生自内部类 BaseInner
.泛型类型参数 ID
的 Sub
作为类型参数传递给基类 Base
.
我的问题:为什么编译器会提示来自 BaseInner
的转换?至 SubInner
在重写 method
的 Sub
?
为了理解警告,我尝试构建一个用例,其中 method
的 Sub<A>
被一些 Sub<B>.SubInner
调用这证明了警告。但是,如果类型不兼容,我能想到的任何东西(包括 ? extends
和 ? super
)都会在方法调用时发出编译器错误。
所以我想没有理由在 method
中发出未经检查的类型转换警告。 .我错过了什么吗?
由于方法覆盖发生在 Sub<ID>
中实现,编译器能够推导出 SubInner
的泛型类型至 Sub<ID>.SubInner
.所以质疑这不是重复!
Eclipse 编译器警告是
Type safety: Unchecked cast from Base<ID>.BaseInner to Sub<ID>.SubInner
即使我使用 Base<ID>.BaseInner
警告也不会改变作为方法参数,如果我使用 Sub<ID>.SubInner
在类型转换中。
最佳答案
这似乎是 Eclipse 编译器问题。
Oracle 编译器 (javac
) 不会忽略此处的任何警告。
关于java - 为什么 Eclipse Java 编译器会提示内部派生类型的转换未经检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38629399/