共変戻り値とは,インタフェースを実装したメソッド,またはサブクラスでオーバーライドするメソッドの戻り値が,その戻り値のサブクラスでも良いという仕様です.JDK5.0以降にこの仕様が追加されました.
共変戻り値の実現を確かめるプログラムを次のように作成しました.スーパークラスSuperと,それを継承したサブクラスSubを定義してあり,インタフェースInterfaceA,抽象クラスAbstractBでSuperを戻り値とするメソッドを記述し,それらを実装,オーバーライドしたメソッドの戻り値をSubとしました.
class Super { } class Sub extends Super { Sub(){ System.out.println("Sub"); } } interface InterfaceA { public Super method(); } class A implements InterfaceA { public Sub method() { return new Sub(); } } abstract class AbstractB { public abstract Super method(); } class B extends AbstractB { public Sub method() { return new Sub(); } } public class ReturnTypeCovarianceTest { public static void main(String[] args) { new A().method(); new B().method(); } }
実行結果
Sub
Sub
また,余談ですが,wikipediaによると型変換演算子には共変(covariant),反変(contravariant),不変(invariant)があるようです.
- 共変:型の順序関係を維持するとき.
- 反変:型の順序関係を反転させるとき.
- 不変:上記いずれにも該当しないとき.