今日、私は面白い何かを見つけました。 次のJava 6クラスを想定:あなたは上記の例をコンパイルしようとした場合タイプ消去を使用したメソッドのオーバーライド
public class Ereasure {
public Object get(Object o) {
return null; // dummy
}
public static class Derived<T> extends Ereasure{
// (1)
@Override
public Object get(T o) {
return super.get(o);
}
// (2)
/*
@Override
public Object get(Object o) {
return super.get(o);
}*/
}
}
、コンパイラは Ereasure.java:9氏は述べています:メソッドは、場合@Override スーパー からメソッドをオーバーライドまたは実装していません。あなたは@Overrideアノテーションを削除します(これは必要ではないはずです)。 Ereasure.java:8:name clash:Ereasure.Derivedのget(T)とEreasureのget(java.lang.Object)は同じ消去を持っていますどちらもどちらももう一方を上書きしない これは少し矛盾しています.TがObjectになるはずなので、親クラスgetメソッドをオーバーライドします。
(1)注釈を付けずにコメントを外す(2)ので、(1)オーバーロードすると(2)どちらも機能しません。 コンパイラ出力:結論として
Ereasure.java:15: get(T) is already defined in Ereasure.Derived
public Object get(Object o) {
、TはObjectにereasedされているが、親がメソッドを取得するオーバーライドすることはできません。
私の質問は今、少なくとも1つの例がコンパイルされていませんか?
@ toto2私はあなたの権利を思っていますが、私はその面白い一見文書化されていないコーナーケースだとも思っています。コンパイラの注意書きによると、Derivedのメソッド定義では、Derivedのgetの無制限型をパブリックObject get(Object o)に変換する必要があります。私は、無限の型から生じるメソッドのディスパッチのあいまいさを解決するために、このことをバイトコードに変換する方法がないと彼は正しいと思います。 – nsfyn55