2013-01-25 15 views
18

Ich habe ein Buch gelesen und es heißt, ich kann eine Methode überschreiben, wenn sie dieselbe Signatur hat. Nach dem Buch ist die Signatur einer Methode Method_Name + Parameter bestanden.Überschreiben Sie eine Methode mit verschiedenen Rückgabetypen in Java?

wie im Buch, ich kann eine Methode überschreiben, die unterschiedliche Rückgabetypen hat. Ist es tatsächlich möglich, eine Methode mit einem anderen Rückgabetyp in Java zu überschreiben? weil ich eine Suche im Netz getan habe, fand ich Leute, die sagen, dass, um eine Methode zu überschreiben, der Rückgabetyp auch sein sollte.

entsprechend dem Buch sagt es auch, dass das Java einen Kompilierungsfehler wirft, wenn wir versuchen, eine Methode mit gleichen Methodennamen und -parametern aber unterschiedlichen Rückgabetypen zu überladen, da die Unterschrift nur den Methodennamen und die Parameter bedeutet. Wenn dies zutrifft, sollten wir eine Methode mit einem anderen Rückgabetyp überschreiben können.

Bitte helfen Sie mir, dies zu verstehen. Danke im Voraus.

+1

Convariant Rückgabetypen wurden in Java 5.0 hinzugefügt würde ich nicht über alles Java 6 zu viel vor Sorge. Es gab einen Fehler in Java 6, der es erlaubte, den Rückgabetyp zu überlasten, aber dies wurde in Java 7 behoben;) –

+0

mögliches Duplikat von [Können überschriebene Methoden sich im Rückgabetyp unterscheiden?] (Http://stackoverflow.com/questions/14694852/can-overridden-methods-different-in-return-type) – nbro

Antwort

25

Sie können einen anderen Typ zurückgeben, solange dieser mit dem Rückgabetyp der überschriebenen Methode kompatibel ist. Kompatibel bedeutet: Es ist eine Unterklasse, Unterschnittstelle 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 nicht den Vertrag der Superklassenmethode, da eine Kuh ein Tier ist. Wenn die abgeleitete Klasse eine Banane zurückgibt, ist das nicht mehr korrekt, da eine Banane kein Tier ist. Hier

+0

Um die Antwort perfekt zu machen, beschreibe sie mit [** Liskow Substitutionsprinzip **] (http://en.wikipedia.org/wiki/Liskov_substitution_principle). – phineas

+5

Bananen sind aber sehr lecker! –

+1

@AdriaanKoster so ist die Kuh. – Prakash

1

Ihre überschriebene Methode kann den gleichen Typ oder den Untertyp des ursprünglichen Rückgabetyps haben, der als kovariante Rückgabe bezeichnet wird.

Wenn Sie den Rückgabetyp der überschriebenen Methode, um etwas anderes zu ändern, die kein Untertyp des ursprünglichen Typs ist, dann würden Sie einen Kompilierung-Fehler.

+0

Kannst du erklären, warum wir Fehler bekommen? oder was ist der Grund dafür? – UnKnown

1

ein Beispiel:

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

class A extends Base { 
    public Long test() { 
     return 1L; 
    } 
} 
3

Ja, es ist möglich, da Java 5, es kovarianten Rückgabetyp genannt wird. Der Rückgabetyp sollte eine Unterklasse des Rückgabetyps der Superklassenmethode sein (primitive Typen 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 
     } 
    } 
} 
11

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

public Price calculatePrice(Items[] items).

Es sagt der Welt einen Preis zu erwarten.

Wenn Sie diese Funktionalität in Ihrer Unterklasse erweitern, müssen Sie immer noch die ursprünglichen Versprechungen der Elternklassen dafür halten.

können Sie überladene Arten hinzufügen der Berechnung:

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

Sie können sogar Ihre Eltern Versprechen, indem Sie eine spezifischere Rückgabetyp verbessern:

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

Aber Sie müssen mindestens den Typ zurückgeben, den Ihre Eltern versprochen haben. Das gleiche gilt für Exceptions in der Methodendeklaration.

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; 
    } 
} 
+0

Vielleicht eine Erklärung hinzufügen. – DaGardner

+0

Willkommen bei SO. Eine Antwort sollte zusätzliche Informationen liefern. Ihre Antwort stellt jedoch künstliche Beschränkungen für die Regeln auf, die JB Nizet bereits vollständig dargelegt hat. – IInspectable

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(); 
} 
} 
Verwandte Themen