静的でない内部クラスを持つ次の汎用クラスBase<ID>
を考えてみましょう。Eclipse Javaコンパイラが、内部派生型のチェックされていないキャストについて不平を言っているのはなぜですか?
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";
}
}
BaseInner
タイプの引数を取るBase.method
方法。次に、次の派生クラスについて考えてみましょう。
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
がSub
の場合は、型引数として基本クラスBase
に渡されます。
私の質問:はなぜコンパイラはSub
のオーバーライドmethod
でSubInner
へBaseInner
からのキャストに文句を言うのでしょうか?
警告を理解するために、Sub<A>
のmethod
が呼び出され、警告が正当化されるSub<B>.SubInner
というユースケースを作成しようとしました。しかし、私が考えることができるもの(? extends
と? super
など)は、型が互換性がない場合は、メソッド呼び出しでコンパイラエラーが発生します。
だから、method
のチェックされていないキャストに関する警告の理由はないと思います。私は何か見落としてますか?
Sub<ID>
実装内でメソッドオーバーライドが発生するため、コンパイラはSubInner
の汎用タイプをSub<ID>.SubInner
に差し引くことができます。だから質問ではない重複!
Eclipseのコンパイラの警告が
型の安全性である:オフは、私が使用している場合ワーリングはどちらも変化しませんサブ< ID> .SubInner
にベース< ID> .BaseInnerからキャストメソッドのパラメータとしてBase<ID>.BaseInner
を使用しても、キャスト式にSub<ID>.SubInner
を使用してもいけません。
ifステートメントで 'o instanceof Sub.SubInner'を使用しているので、次のステートメントで' Sub.SubInner'も使用しないでください。 – nbro
私はすでにキャストで 'Sub .SubInner'を使用していますが、常に同じ警告が生成されます。 –
niks
どのコンパイラを使用していますか?私はjavac 8で警告を受け取りません。 – assylias