2016-03-23 7 views
2

Ich verstehe Java Best Practice schlägt vor, dass bei der Deklaration einer Variablen die generische Schnittstelle verwendet wird, um auf der linken Seite und die spezifische Implementierung auf der rechten Seite zu deklarieren.TreeSet in Java

Also wenn ich die Set-Schnittstellen zu erklären haben, der richtige Weg ist,

Set<String> set = new TreeSet<>(); 

jedoch mit dieser Erklärung Ich bin nicht in der Lage, die set.last() Methode zuzugreifen. Allerdings , wenn ich es auf diese Weise erklären,

TreeSet<String> set = new TreeSet<>(); 

ich zugreifen kann, last() und first(). Kann mir jemand helfen zu verstehen warum?

Antwort

4

Die last() und first() sind spezifische Methoden, die zu TreeSet gehören und nicht die generische Schnittstelle Set. Wenn Sie auf die Variable verweisen, wird der Quelltyp und nicht der zugewiesene Typ betrachtet. Wenn Sie also eine TreeSet als Set speichern, kann diese nur als Set behandelt werden. Dies im Wesentlichen versteckt die zusätzliche Funktionalität.

Als Beispiel erweitert jede Klasse in Java Object. Daher ist dies eine völlig gültige Zuordnung:

final Object mMyList = new ArrayList<String>();

Allerdings werden wir niemals in der Lage sein ArrayList Stil Funktionalität zu verwenden, wenn ohne Anwendung Typ-Casting direkt auf mMyList Bezug genommen wird, da alle Java sagen kann ist, dass es handelt sich um ein generisches Object; nichts mehr.

+0

Nur einer, der die beste +1 beantwortet –

1

Die Schnittstelle Set bietet keine last() und first(), weil es nicht immer sinnvoll für eine Set ist.

Java ist eine statische Eingabesprache. Wenn Compiler Sie sehen, set.last() zu tun, wie es set erwartet wird, um ein Set zu sein. Es wird nicht wissen, ob set ein TreeSet ist, das last() bereitstellt, oder es ist ein HashSet, das nicht funktioniert. Deshalb beschweren sie sich.

Festhalten. Sie müssen es nicht mit der konkreten Klasse TreeSet hier deklarieren. TreeSet trägt eine Schnittstelle, die solche Methoden zur Verfügung stellt. In einem anderen Wort: weil Sie mit einem Set arbeiten müssen, die sortiert wird (für die es sinnvoll first() und last() zu schaffen machen), die Schnittstelle, die Sie gegen sollte SortedSet statt Set

Daher sein funktionieren sollte, was sollte man sein dabei ist

SortedSet<String> set = new TreeSet<>(); 
2

Sie die SortedSet Schnittstelle als Erklärung verwenden können (die die first() und last() Methoden hat).