web-dev-qa-db-ja.com

Javaで異なる戻り値の型を持つメソッドをオーバーライドしますか?

本を読んだところ、同じ署名があればメソッドをオーバーライドできると書いてあります。本によれば、メソッドのシグネチャは、Method_Name +渡されるパラメータです。

本のとおり、異なる戻り値の型を持つメソッドをオーバーライドできます。 Javaで異なる戻り値の型を持つメソッドをオーバーライドすることは実際に可能ですか?私はネットでいくつかの検索を行ったので、メソッドをオーバーライドするには戻り値の型も同じである必要があると人々が言っ​​ているのを見つけました。

本によると、Javaは、同じメソッド名とパラメーターを持つが、戻り値の型が異なるメソッドをオーバーロードしようとすると、コンパイルエラーをスローします。これは、署名がメソッド名とパラメーターのみを意味するためです。これがtrueの場合、異なる戻り値の型を持つメソッドをオーバーライドできるはずです。

これを理解してください。前もって感謝します。

18
nzhmz

オーバーライドされたメソッドの戻り型と互換性がある限り、別の型を返すことができます。互換性があるという意味:これは、オーバーライドされたメソッドによって返されるサブクラス、サブインターフェース、またはクラスやインターフェースの実装です。

そしてそれは論理的です。メソッドが動物を返し、派生クラスが牛を返す場合、牛は動物であるため、スーパークラスメソッドの規約に違反していません。派生クラスがバナナを返す場合、バナナは動物ではないため、これはもう正しくありません。

25
JB Nizet

あなたの親クラスは外の世界に約束をしました。たとえば、メソッド:

public Price calculatePrice(Items[] items)

それは価格を期待するように世界に伝えます。

サブクラスでその機能を拡張する場合でも、親クラスの元のプロミスを維持する必要があります。

オーバーロードした計算方法を追加できます。

public Price calculatePrice(Items[] items, Integer minimumCharge)

さらに特定の戻り値の型を使用して、親の約束を改善することもできます。

public AccuratePrice calculatePrice(Items[] items, Integer minimumCharge)

ただし、少なくとも親が約束した型を返す必要があります。メソッド宣言の例外についても同様です。

11
David Lavender

はい、可能です。Java 5の場合、これは共変戻り値型と呼ばれます。戻り値の型は、スーパークラスメソッドの戻り値型のサブカスケードである必要があります(プリミティブ型は許可されません)。例

class X implements Cloneable {

    @Override
    protected X clone() {
        try {
            return (X) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new Error(e); // can never happen
        }
    }
}
3

オーバーライドされたメソッドは、共変戻りと呼ばれる元の戻りの型と同じ型またはサブ型を持つことができます。

オーバーライドされたメソッドの戻り値の型を、元の型のサブタイプではない何かに変更すると、コンパイル時エラーが発生します。

1
PermGenError

次に例を示します。

class Base {
    public Number test() {
        return 0;
    }
}

class A extends Base {
    public Long test() {
        return 1L;
    }
}
1
jdb
// Covariant Overriding 
public class Parent {

  public Parent(){}
  String parentName;
  public Parent(String parentName){
    this.parentName=parentName;
    System.out.println(this.parentName);
 }

public  Parent show(){
    return new Parent("Parent");
}
}




public class Child extends Parent{

  public Child(){}
  String name;
  public Child(String name){
    this.name=name;
    System.out.println(this.name);
  }
  public Child show(){
    return new Child("Child");
}
}



public class Main {

public static void main(String[] args) {
    Parent parent=new Child();
    parent.show();

    Parent parent1=new Parent();
    parent1.show();
}
}
0
Deepak
Yes we can override different return types but they should be subclass.

public class Shape {
    public Shape area(Integer i) {
        System.out.println("Sape Area");
        System.out.println("Integer");
        return null;
    }
}


package com.oops;

public class Circle extends Shape {
    public Circle area(Integer i) {
        System.out.println("Circle Area");
        System.out.println("int");
        return null;
    }
}
0
shwetank