2014-12-09 11 views
6

Ich habe Schwierigkeiten zu verstehen, die Java-Wege-Schnittstelle Vererbung Beispiel der Interpretation:Vererbung Schnittstelle - Ändern Methodenparameter

public interface Model { 
    Model getModel(); 
    void setModel(Model model); 
} 

public class BaseModel implements Model { 
    @Override 
    public BaseModel getModel() { return null; } // works 

    @Override 
    public void setModel(BaseModel model) {} // compilation error, it wants Model instead of BaseModel 
} 

Könnte jemand erklären, warum die erste Methode funktioniert, und die zweiten nicht?

Antwort

3

Um dies zu verstehen, sollten Sie sich fragen "Kann ich Ersatz BaseModel für jede Verwendung der Model Schnittstelle"?

Wenn Sie den Rückgabewert spezialisieren, funktioniert das einwandfrei. Auch wenn getModel() eine BaseModel zurückgibt, kann sie immer einer Variablen zugewiesen werden.

Model model = myModel.getModel(); 

Andersherum ist nicht wahr, aber:

SomeOtherModel other = ...; 
myModel.setModel(other); // no problem 
myBaseModel.setModel(other); // other is not a BaseModel! 

wenn setModel einen BaseModel Parameter zu akzeptieren, sind Sie seine Fähigkeit, brechen würden mit anderen Implementierungen von Model eingestellt werden. Daher ist dies nicht erlaubt.

3

So funktioniert das Überschreiben von Funktionen.

  1. Die Funktionsparameter müssen exakt identisch sein.

  2. Die Rückgabetypen können unterschiedlich sein, aber muss bezogen werden.

Also in Ihrem Fall ist getModel in Ordnung, da der Rückgabetyp (BaseModel) zu Model verwandt ist, aber setModel ist nicht gültig, da die Parameter-Typen unähnlich sind.

5

Ihre erste Rückgabetyp der Methode covariant ist und erlaubt und Rückgabetyp ist nicht ein Teil der Methodensignatur seines daher erlaubt

Während Parameter ein Verfahren ein Teil der Signatur ist und streng der Schnittstelle Unterschrift folgen und daher scheitert es in deinem Fall.

Nun da Sie Ihre Methode mit @Override annotiert haben, versuchen Sie, die Methode zu überschreiben, daher beschwert sich der Compiler über dasselbe. Wenn Sie dies nur entfernen und zusätzlich zur vorhandenen Implementierung die Methode per Schnittstelle implementieren, wird die Methode überladen.

2

Methodenname und Parametertypen erstellt eine Methodensignatur in Java und nicht den Rückgabetyp. Wenn Sie eine Methode überschreiben, sollte die Signatur der Methode dieselbe sein Wenn Sie die Signatur ändern, wird sie überladen und nicht überschrieben - um es zu sehen, wenn Sie die @Override Annotation entfernen, wird es funktionieren.

Verwandte Themen