Java 5 以降、共変の戻り値の型を持つことが許可されています。Java API がこれを利用しないのはなぜですか?
たとえばGraphics2D.create()
、Graphics2D
オブジェクトを返すためにオーバーライドされないのはなぜですか? すべての状況で下位互換性があるように思えます。
Java 5 以降、共変の戻り値の型を持つことが許可されています。Java API がこれを利用しないのはなぜですか?
たとえばGraphics2D.create()
、Graphics2D
オブジェクトを返すためにオーバーライドされないのはなぜですか? すべての状況で下位互換性があるように思えます。
一般に、これは下位互換性を維持するためのものです。互換性はバイトコード レベルでも維持する必要があり、戻り値の型を変更するとバイトコードが変更されることに注意してください。したがって、一般に、問題のメソッドをオーバーライドした可能性のあるサブクラスがある場合、共変の戻り値の型に切り替えると、それらのクラスが壊れます。
は抽象的であるためGraphics2D
、明らかにサブクラス化することを意図しているため、上記の理由が適用されます。
Java Generics and Collectionsは、ジェネリックの観点に重点を置いていますが、セクション 8.4 に共変オーバーライドに関する議論が含まれています。
それはバイナリ互換性を壊します。以前にコンパイルされたクラスは、新しい戻り値の型を持つメソッドを見つけることができません。JLS3 §13.4.15、§13.4.12