Als ich die Deklaration von ArrayList
implementiert List
interface, obwohl die Oberklasse ArrayList
AbstractList
dieselbe List
Schnittstelle implementiert.
Ä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.
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.
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.