4

これは有効な Java です。

public interface Bar {
    Number getFoo();
}

public class MyBar implements Bar {
    @Override
    public Integer getFoo() {
        return Integer.MAX_VALUE;
    }
}

Integer は Number のサブクラスであるため、Java が有効である理由がわかりました。しかし、言語がサブクラスが戻り値の型を再定義できるようにする正当な理由があるかどうか疑問に思っていますか? これが便利な場所はありますか?ベスト プラクティスでは、次のようにする必要はありません。

public class MyBar implements Bar {
    @Override
    public Number getFoo() {
        return Integer.MAX_VALUE;
    }
}
4

8 に答える 8

8

Integerは のサブタイプであるためNumber、戻り型の置換として使用できます。

これは共変の戻り値の型と呼ばれていると思います。こちらを参照してください。

サブクラスが親クラスよりも具体的であり、サブタイプの可能性があるクラスなどの制限を追加する必要がある場合に使用します。

したがって、 Jeff Storey の例とは別に、次のことが可能です。

public static class MyFoo extends MyBar {

    @Override
    public Integer getFoo() {
        return super.getFoo();
    }

}

だがしかし

public static class MyFoo extends MyBar {

    @Override
    public Number getFoo() { // compile error: The return type is incompatible with MyBar.getFoo()
        return super.getFoo();
    }

}
于 2013-09-18T15:13:06.943 に答える