1. ホーム
  2. java

[解決済み] オーバーライドされたメソッドは、戻り値の型を変えることができますか?

2022-04-24 06:09:36

質問

オーバーライドされたメソッドに 異なる戻り値のタイプ ?

解決方法は?

Javaがサポートするもの <上 * オーバーライドされたメソッドに対して共変量戻り値型を使用します。つまり、オーバーライドされたメソッドには より という特定の戻り値の型があります。つまり、新しい戻り値の型がオーバーライドするメソッドの戻り値の型に割り当て可能である限り、それは許可されます。

例えば

class ShapeBuilder {
    ...
    public Shape build() {
    ....
}

class CircleBuilder extends ShapeBuilder{
    ...
    @Override
    public Circle build() {
    ....
}

で指定されています。 Java言語仕様書8.4.5項 :

戻り値の型が参照型の場合、互いにオーバーライドするメソッド間で戻り値の型が異なることがあります。return-type-substitutabilityの概念は、covariant return、つまり、戻り値の型をサブタイプに特化することをサポートします。

戻り値型R1を持つメソッド宣言d1は、以下の条件が成立する場合に限り、戻り値型R2を持つ別のメソッドd2に対して戻り値型代入可能である。

  • R1 が void ならば R2 も void である。

  • R1がプリミティブ型の場合、R2はR1と同一である。

  • もしR1が参照型であるなら

    • R1 は R2 のサブタイプであるか、未チェックの変換 (§5.1.9) により R1 を R2 のサブタイプに変換できるか、または

    • R1 = |R2|

("|R2|"で定義されるR2の消去を指します。 JLS §4.6 .)


* Java 5 以前の Java には 不変量 つまり、オーバーライドするメソッドの戻り値の型は、オーバーライドするメソッドと正確に一致する必要がありました。