webentwicklung-frage-antwort-db.com.de

Überschreiben einer Methode mit verschiedenen Rückgabetypen in Java?

Ich habe ein Buch gelesen und besagt, dass ich eine Methode überschreiben kann, wenn sie dieselbe Signatur hat. Die Signatur einer Methode lautet laut Buch Method_Name + Übergebene Parameter.

wie im Buch beschrieben, kann ich eine Methode mit verschiedenen Rückgabetypen überschreiben. Ist es tatsächlich möglich, eine Methode mit einem anderen Rückgabetyp in Java zu überschreiben? Da ich einige Suchanfragen im Netz durchgeführt habe, fand ich Leute, die sagten, dass der Rückgabetyp zum Überschreiben einer Methode gleich sein sollte.

laut dem Buch heißt es auch, dass Java einen Kompilierungsfehler auslösen wird, wenn wir versuchen, eine Methode mit demselben Methodennamen und Parametern, aber unterschiedlichen Rückgabetypen zu überladen, da die Signatur nur den Methodennamen und die Parameter bedeutet. Wenn dies der Fall ist, sollten wir eine Methode mit einem anderen Rückgabetyp überschreiben können.

Bitte hilf mir das zu verstehen. Danke im Voraus.

18
nzhmz

Sie können einen anderen Typ zurückgeben, sofern er mit dem Rückgabetyp der überschriebenen Methode kompatibel ist. Kompatibel bedeutet: Es handelt sich um eine Unterklasse, Subschnittstelle oder Implementierung der Klasse oder Schnittstelle, die von der überschriebenen Methode zurückgegeben wird.

Und das ist logisch. Wenn eine Methode ein Animal zurückgibt und Ihre abgeleitete Klasse eine Kuh zurückgibt, brechen Sie den Vertrag der Superklassenmethode nicht, da eine Kuh ein Animal ist. Wenn die abgeleitete Klasse eine Banane zurückgibt, ist dies nicht mehr korrekt, da eine Banane kein Tier ist.

25
JB Nizet

Ihre Elternklasse hat der Außenwelt ein Versprechen gegeben. Zum Beispiel die Methode:

public Price calculatePrice(Items[] items).

Es sagt der Welt, dass sie einen Preis erwarten soll.

Wenn Sie diese Funktionalität in Ihrer Unterklasse verbessern, müssen Sie immer noch die ursprünglichen Versprechen Ihrer Elternklassen einhalten.

Sie können überladene Berechnungsmethoden hinzufügen:

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

Sie können sogar die Versprechen Ihrer Eltern verbessern, indem Sie einen MEHR-spezifischen Rückgabetyp verwenden:

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

Sie müssen jedoch mindestens den Typ zurückgeben, den Ihre Eltern versprochen haben. Gleiches gilt für Ausnahmen in der Methodendeklaration.

11
David Lavender

Ja, es ist seit Java 5 möglich, es wird als kovarianter Rückgabetyp bezeichnet. Der Rückgabetyp sollte eine Unterkategorie des Rückgabetyps der Superklassenmethode sein (Primitivtypen sind nicht zulässig). Beispiel 

class X implements Cloneable {

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

Ihre Überschreibungsmethode kann denselben Typ oder den Untertyp von .__ haben. ursprünglicher Rückgabetyp, der als kovariante Rückgabe bezeichnet wird.

Wenn Sie den Rückgabetyp der Überschreibungsmethode in einen anderen Typ ändern, der kein Untertyp des ursprünglichen Typs ist, wird ein Fehler beim Kompilieren angezeigt.

1
PermGenError

Hier ist ein Beispiel:

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