20

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

本のように、私は異なるリターンタイプを持つメソッドをオーバーライドすることができます。Javaで異なるreturntypeのメソッドをオーバーライドすることは実際に可能ですか?ネット上で検索を行ったので、メソッドをオーバーライドするにはリターンタイプも同じである必要があると言う人が見つかりました。

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

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

4

7 に答える 7

27

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

そしてそれは論理的です。メソッドがAnimalを返し、派生クラスがCowを返す場合、CowはAnimalであるため、スーパークラスメソッドのコントラクトを破ることはありません。派生クラスがバナナを返す場合、バナナは動物ではないため、これは正しくありません。

于 2013-01-25T10:28:56.500 に答える
12

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

public Price calculatePrice(Items[] items)

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

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

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

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

より具体的な返品タイプを使用することで、親の約束を改善することもできます。

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

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

于 2013-01-25T10:37:44.097 に答える
4

はい、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
        }
    }
}
于 2013-01-25T10:31:38.407 に答える
1

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

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

于 2013-01-25T10:26:44.167 に答える
1

次に例を示します。

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

class A extends Base {
    public Long test() {
        return 1L;
    }
}
于 2013-01-25T10:29:48.847 に答える
0
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;
    }
}
于 2013-08-17T20:42:07.383 に答える
0
// 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();
}
}
于 2016-04-23T10:27:50.597 に答える