私はjavaで奇妙なジェネリックを試しています。次のコードでは、foo
のオーバーライドは機能しますが、bar
のオーバーライドは機能しません。なぜか分からない。奇妙なジェネリックのJavaメソッドのオーバーライドエラー
2つのオーバーライドの唯一の違いは、MB
の制約にあることに注意してください。 foo
を無効にすると、MB
はAlpha<B, MB>
に拡張され、機能します。 bar
MB
をオーバーライドすると、Beta<B, MB>
がAlpha<B, MB>
に拡張されても、Beta<B, MB>
が拡張され、機能しません。
MB extends Beta<B, MB>
とBeta<A, MA> extends Alpha<A, MA>
は、MB extends Alpha<B, MB>
を意味すると思います。ではなぜそれは機能しませんか?
import java.util.function.Function;
abstract class Alpha<A, MA extends Alpha<A, MA>> {
abstract public <B, MB extends Alpha<B, MB>> MB foo(Function<A, B> f);
abstract public <B, MB extends Alpha<B, MB>> MB bar(Function<A, B> f);
}
class Beta<A, MA extends Beta<A, MA>> extends Alpha<A, MA> {
@Override public <B, MB extends Alpha<B, MB>> MB foo(Function<A, B> f) { return null; }
@Override public <B, MB extends Beta<B, MB>> MB bar(Function<A, B> f) { return null; }
}
同じ問題の[ここに簡略化されたバージョン](http://ideone.com/j9QkOG)。ジェネリックメソッドをオーバーライドするときは、型パラメーターの境界を変更することはできません。 – Radiodef
関連するhttp://stackoverflow.com/questions/23438813/cannot-override-generic-interface – Tunaki
OKの人、私は今理解しています。要約すると、ジェネリック型の境界を変更しながらメソッドをオーバーライドすることはできません。期間。これは、ジェネリック型とイベントの使用方法に関係なく、使用するかどうかに関係なく使用されます。 –