10

Java 5 以降、共変の戻り値の型を持つことが許可されています。Java API がこれを利用しないのはなぜですか?

たとえばGraphics2D.create()Graphics2Dオブジェクトを返すためにオーバーライドされないのはなぜですか? すべての状況で下位互換性があるように思えます。

4

2 に答える 2

12

一般に、これは下位互換性を維持するためのものです。互換性はバイトコード レベルでも維持する必要があり、戻り値の型を変更するとバイトコードが変更されることに注意してください。したがって、一般に、問題のメソッドをオーバーライドした可能性のあるサブクラスがある場合、共変の戻り値の型に切り替えると、それらのクラスが壊れます。

は抽象的であるためGraphics2D、明らかにサブクラス化することを意図しているため、上記の理由が適用されます。

Java Generics and Collectionsは、ジェネリックの観点に重点を置いていますが、セクション 8.4 に共変オーバーライドに関する議論が含まれています。

于 2010-09-20T12:05:46.007 に答える
4

それはバイナリ互換性を壊します。以前にコンパイルされたクラスは、新しい戻り値の型を持つメソッドを見つけることができません。JLS3 §13.4.15、§13.4.12

于 2010-09-20T15:48:49.810 に答える