2016-06-28 22 views
2

Wenn meine eigenen Datenstrukturen Implementierung, die eine vergleichbare Art erfordern ich immer so wie dies getan haben:Welche Vorteile hat es, Laufzeitausnahmen über Compile-Time-Prüfungen für Sammlungen zu werfen, die vergleichbare Typen erzwingen?

public class ComparableCollection<E extends Comparable<E>> { ... }

Das ist offensichtlich die vergleichbare Einschränkung erzwingt bei der Kompilierung. Aber ich war in den letzten paar Jahren ein Student und habe irgendwie übersehen, dass die Java-Implementierungen für Collections, die einen vergleichbaren Typ durchsetzen, dies nicht zur Kompilierungszeit tun, sondern zur Laufzeit, indem möglicherweise ein ClassCastException geworfen wird, während ein Element hinzugefügt wird; zB:

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, ... { ... }

TreeSet wird von einem NavigableMap gesichert, die, wenn es Comparatornull ist, versucht, den Schlüssel zu werfen wie so:

Comparable<? super K> k = (Comparable<? super K>) key;

Nun, wenn der Typ isn eingeführt wird 't vergleichbar Ein ClassCastException wird geworfen.

Was sind die wirklichen Vorteile dieses Entwurfs gegenüber dem Erzwingen der Einschränkung zur Kompilierzeit?

+0

Siehe auch http://stackoverflow.com/questions/13890542/creating-a-treeset-with-a-non-comparable-class-why-a-run-time-exception-rather. Elemente in einem TreeSet müssen nicht vergleichbar sein, Sie können explizit einen Komparator angeben. – Tunaki

+0

@Tunaki, erstaunlich, wie etwas viel mehr Sinn macht, wenn man aus dem eigenen Kopf kommt. Das macht einfach zu viel Sinn. Einen Moment jetzt haben. – ChiefTwoPencils

Antwort

1

Der Vorteil ist, dass Sie TreeSet dann mit Objekten verwenden können, die Comparable nicht implementieren, für die Sie jedoch eine Comparator bereitstellen können.

Für mehr über die Unterschiede zwischen Vergleichbar einem Vergleicher finden Sie unter: Java : Comparable vs Comparator

+0

Einige weitere Erklärung, bitte? – hd1

+0

In der Tat. Nur weil eine Klasse "Vergleichbar" nicht implementiert, heißt das nicht, dass sie nicht vergleichbar sein muss oder nicht. – ChiefTwoPencils

0

Sie nicht kontrollieren können, was Objekte immer in Collection bei Compile Zeit eingeführt zu werden. Es ist flexibler, um eine dynamische Definition der Sammlung zu ermöglichen.