165

オーバーライドされたメソッドは異なるリターンタイプを持つことができますか?

4

12 に答える 12

205

Java は、オーバーライドされたメソッドに対して*共変の戻り値の型をサポートします。これは、オーバーライドされたメソッドがより具体的な戻り値の型を持つ可能性があることを意味します。つまり、新しい戻り値の型がオーバーライドするメソッドの戻り値の型に割り当て可能である限り、それは許可されます。

例えば:

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

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

これは、Java 言語仕様のセクション 8.4.5 で指定されています。

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

次の条件が満たされる場合に限り、戻り値の型 R1 を持つメソッド宣言 d1 は、戻り値の型 R2 を持つ別のメソッド d2 の戻り値の型で代用可能です。

  • R1 が無効の場合、R2 は無効です。

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

  • R1 が参照型の場合:

    • R1 が R2 のサブタイプであるか、R1 がチェックなしの変換 (§5.1.9) によって R2 のサブタイプに変換できるか、または

    • R1 = |R2|

(「|R2|」は、JLS の §4.6 で定義されているように、R2 の消去を指します。)


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

于 2013-02-04T20:18:47.020 に答える
21

はい、サブタイプを返す場合。次に例を示します。

package com.sandbox;

public class Sandbox {

    private static class Parent {
        public ParentReturnType run() {
            return new ParentReturnType();
        }
    }

    private static class ParentReturnType {

    }

    private static class Child extends Parent {
        @Override
        public ChildReturnType run() {
            return new ChildReturnType();
        }
    }

    private static class ChildReturnType extends ParentReturnType {
    }
}

このコードはコンパイルおよび実行されます。

于 2013-02-04T20:20:57.467 に答える
5

はい 可能です..戻り値の型は、親クラス メソッドの戻り値の型が
子クラス メソッドの戻り値の型のスーパー タイプである場合にのみ異なります..
手段

class ParentClass {
    public Circle() method1() {
        return new Cirlce();
    }
}

class ChildClass extends ParentClass {
    public Square method1() {
        return new Square();
    }
}

Class Circle {

}

class Square extends Circle {

}


これがそうである場合、異なる戻り値の型を許可できます...

于 2016-03-01T17:44:11.943 に答える
1

オーバーライドタイプとリターンタイプ、および共変リターン
サブクラスは、継承されたバージョンと完全に一致するメソッドを定義する必要があります。または、Java 5以降、

サンプルコード


                                                                                                            class Alpha {
          Alpha doStuff(char c) {
                  return new Alpha();
              }
           }
             class Beta extends Alpha {
                    Beta doStuff(char c) { // legal override in Java 1.5
                    return new Beta();
                    }
             } } 
Java 5、このコードはコンパイルされます。このコードを1.4コンパイラでコンパイルしようとすると、互換性のない戻り型を使用しようとしていると表示されます–sandeep19871分前

于 2013-02-04T21:00:47.687 に答える
1

戻り値の型は、スーパークラスの元のオーバーライドされたメソッドで宣言された戻り値の型と同じか、そのサブタイプである必要があります。

于 2013-02-04T20:36:26.997 に答える
0

はい、可能です

class base {

 base show(){

System.out.println("base class");

return new base();

}
}

class sub extends base{

sub show(){

    System.out.println("sub class");

    return new sub();

 }
}

class inheritance{

 public static void main(String []args) {

        sub obj=new sub();

            obj.show();
 }
}
于 2014-07-23T20:09:47.240 に答える