Gibt es einen Vorteil bei der Implementierung einer Schnittstelle in einer Unterklasse, obwohl die Oberklasse die gleiche Schnittstelle implementiert

8

Als ich die Deklaration von ArrayList

sah %Vor%

implementiert List interface, obwohl die Oberklasse ArrayList AbstractList dieselbe List Schnittstelle implementiert.

%Vor%

Ähnliche Deklarationen finden Sie auch in HashMap , LinkedHashMap declarations.

In der Deklaration von LinkedHashMap implementiert es nur Map interface und nicht die anderen Interfaces, die von seiner Oberklasse HashMap implementiert wurden.

Es könnte also einige Vorteile haben, solche Deklarationen zu haben.

    
Charles Green Way 05.04.2013, 12:27
quelle

6 Antworten

6

Es gibt keine funktionalen Vorteile, um sie erneut zu deklarieren, sie beeinflusst das Verhalten in keiner Weise.

Ich denke, es wird nur hinzugefügt, um zu verdeutlichen, welche Schnittstellen implementiert sind.

    
Keppil 05.04.2013, 12:30
quelle
3

Dies geschieht nur zu Dokumentationszwecken, um dem Benutzer der Klasse, die die Schnittstellen implementiert, sofort klar zu machen.

Die redundante implements -Klausel macht für den Compiler keinen Unterschied.

    
NPE 05.04.2013 12:30
quelle
1

Ja. Es hätte weggelassen werden können. Aber so ist es sofort sichtbar, dass es sich um eine Liste handelt. Andernfalls wäre ein zusätzlicher Klick durch den Code / die Dokumentation erforderlich. Ich denke, das ist der Grund - Klarheit.

Und um das hinzuzufügen, was Joeri Hendrickx kommentiert hat - es soll zeigen, dass ArrayList List implementiert. AbstractList im gesamten Bild dient nur zur Vereinfachung und zur Verringerung der Code-Duplizierung zwischen List-Implementierungen.

Referenz: Warum hat ArrayList "implementiert Liste"?

    
Waqas Memon 05.04.2013 12:38
quelle
1

Völlig unnötig. Ich würde es überhaupt nicht tun.

Es ist unklar, warum sie das bis dahin getan haben. Aber jetzt ist es offensichtlich ein Fehler, da alle überrascht sind, wenn sie diese merkwürdige Redundanz bemerken.

    
ZhongYu 05.04.2013 17:09
quelle
0

Nun, auf diese Weise müssen Sie List<E> -Methoden implementieren, wenn Sie eine Unterklasse zu AbstractList erstellen, und Sie können auch ArrayList als AbstractList verwenden.

    
Pietu1998 05.04.2013 12:31
quelle
0

ArrayList<T> und AbstractList<T> implementieren List<T> für verschiedene Zwecke.

  • List<T> richtet ein, was erforderlich ist, damit eine Klasse eine Liste sein kann.
  • ArrayList<T> implementiert List<T> als Teil der Definition einer eigenen Schnittstelle . Dies ist wesentlich dafür, was ArrayList<T> ist.
  • ArrayList<T> erweitert AbstractList<T> als Teil seiner eigenen Implementierung . Dies ist völlig optional: Man hätte ArrayList<T> von Grund auf neu implementieren können, ohne AbstractList<T> zu erben, und die Klasse würde auf die gleiche Weise funktionieren.
  • AbstractList<T> ist als Basisklasse für andere Implementierungen von List<T> gedacht. Anstatt eine Schnittstelle einzurichten, folgt einer bestehenden. AbstractList<T> 's Implementierung von List<T> ist nicht erforderlich, alles würde kompilieren und ohne dasselbe laufen. Durch die Vererbung von List<T> kann der Java-Compiler potenzielle Diskrepanzen zwischen den Schnittstellenmethoden und den Methoden von AbstractList<T> erkennen. Daher ist es sehr empfehlenswert, AbstractList<T> zu implementieren, um List<T> interface.
  • zu implementieren
dasblinkenlight 15.02.2018 13:21
quelle

Tags und Links