Ich möchte wissen, warum das .compareTo()
in der Comparable
Schnittstelle ist, während eine Methode wie .equals
in der Object
Klasse ist. Mir erscheint es willkürlich, warum eine Methode wie diese .compareTo()
nicht schon in der Object
Klasse ist.
Zur Verwendung .compareTo()
implementieren Sie die Comparable
Schnittstelle und implementieren die .compareTo()
Methode für Ihre Zwecke. Für die .equals()
Methode überschreiben Sie einfach die Methode in Ihrer Klasse, da alle Klassen von der Object
Klasse erben .
Meine Frage ist, warum ist eine Methode wie .compareTo()
in einer Schnittstelle, die Sie implementieren, und nicht in einer Klasse wie Object
? Ebenso, warum soll die .equals()
Methode in der Klasse Object
und nicht in irgendeiner Schnittstelle implementiert werden?
quelle
Eq
Wertgleichheit zu erhalten (tatsächlich stellen Sie der Typenklasse eine Instanz zur Verfügung ).Antworten:
Nicht alle Objekte können verglichen werden, aber alle Objekte können auf Gleichheit überprüft werden. Wenn nichts anderes, kann man sehen, ob zwei Objekte an derselben Stelle im Speicher existieren (Referenzgleichheit).
Was bedeutet das für
compareTo()
zweiThread
Objekte? Wie ist ein Thread "größer" als ein anderer? Wie vergleicht man zweiArrayList<T>
s?Der
Object
Vertrag gilt für alle Java-Klassen. Wenn nicht einmal eine Klasse mit anderen Instanzen ihrer eigenen Klasse verglichen werdenObject
kann, muss sie nicht Teil der Schnittstelle sein.Joshua Bloch verwendet die Schlüsselwörter "natürliche Reihenfolge", wenn er erklärt, warum eine Klasse möglicherweise implementieren möchte
Comparable
. Nicht jede Klasse hat eine natürliche Reihenfolge, wie ich oben in meinen Beispielen erwähnt habe, daher sollte nicht jede Klasse die Methode implementierenComparable
oderObject
habencompareTo
.Effektives Java, Zweite Ausgabe : Joshua Bloch. Punkt 12, Seite 62. Ellipsen entfernen Verweise auf andere Kapitel und Codebeispiele.
Für Fälle , in denen Sie haben eine Bestellung auf nicht aufzwingen wollen
Comparable
Klasse , die keine natürliche Ordnung hat, können Sie immer eine VersorgungComparator
Instanz Hilfe sortieren sie.quelle
==
für letztere haben, hat dies einen hohlen Ring. Ohne Berücksichtigung der redundanten Standardeinstellung kann man gültige Gründe finden, die nicht fürequals
alle Klassen gelten, da möglicherweise nicht alle Typen eine Äquivalenzbeziehung unterstützen.==
", da die Instanziierung dieser Klassen ein Implementierungsdetail darstellt, die Sprache es jedoch unmöglich macht, sie zu verbergen. Man könnte sagen, dass jeder, der zweiInteger
s anhand von Referenzen vergleicht, ein Idiot ist, aber es ist immer noch langweilig, den Vergleich zuzulassen.Das JLS §4.3.2 definiert das
class
Objekt folgendermaßen:Also, das ist, warum
equals
in ist ,Object
abercompareTo
in einer separaten Schnittstelle. Ich würde spekulieren, dass sieObject
so gering wie möglich halten wollten . Sie dachten wahrscheinlich, dass fast alleObjects
benötigen würdenequals
undhashCode
(was eigentlich nur eine Form der Gleichheitsprüfung ist), aber nicht alle Objekte müssten ein Konzept der Ordnung haben , wofürcompareTo
es verwendet wird.quelle
Equitable<T>
aber wenn esObject
implementiert wäre, wäre jede Klasse einEquitable<Object>
. Gibt es an diesem Punkt einen Unterschied? In der Tat nicht wirklich, in der Komplexität ja.object
hatEquals(object)
, genau wie in Java, aber es gibt auch dieIEquatable<T>
Schnittstelle. Obwohl der Hauptgrund dafür ist, dass Boxing vermieden wird, wennT
es sich um einen Werttyp handelt, der in Java nicht möglich ist.equals
deklariertObject
wird:The methods equals and hashCode are declared for the benefit of hashtables such as java.util.Hashtable (§21.7)
- als Java-Design Da Java 1.0 abwärtskompatibel ist, ist die Auswahl des Java 1.0-Designs der eigentliche Grund dafürequals
, wo es sich befindet.Denken Sie neben der hervorragenden Antwort von Snowman daran, dass es sich
Comparable
seit langem um eine allgemeine Benutzeroberfläche handelt. Ein Typ implementiert nichtcompareTo(object)
, er implementiert,compareTo(T)
woT
sein eigener Typ ist. Dies kann nicht implementiert werdenobject
, daobject
die Klasse, die daraus abgeleitet wird, nicht bekannt ist.object
hätte einecompareTo(object)
Methode definieren können , aber dies hätte nicht nur erlaubt, was Snowman hervorhebt, einen Vergleich zwischen zweiArrayList<T>
s oder zwischen zweiThread
s, sondern sogar einen Vergleich zwischen einemArrayList<T>
und einemThread
. Das ist noch unsinniger.quelle
Angenommen, ich habe zwei Objektreferenzen: X gibt eine Instanz an
String
, in der der Inhalt "George" gespeichert ist. Y kennzeichnet eine Instanz zumPoint
Halten der Koordinaten [12,34]. Betrachten Sie die folgenden zwei Fragen:Identifizieren X und Y gleichwertige Objekte?
Soll X vor, nach oder gleich Y sortieren?
Die Tatsache, dass X und Y Instanzen von nicht verwandten Typen identifizieren, ist bei der Prüfung der ersten Frage kein Problem. Objekte können nur dann als äquivalent betrachtet werden, wenn ihre Typen eine gemeinsame Basis haben, die sie als äquivalent definiert. da
String
undPoint
hat keine solche Basis (ihr einziger gemeinsamer Bezug auf Basistyp alle unterschiedlichen Objekte als nicht-äquivalent) , die Antwort ist einfach „nein“.Die Tatsache, dass die Typen nicht miteinander verwandt sind, wirft jedoch ein großes Problem in Bezug auf die zweite Frage auf. Einige Typen definieren Ordnungsbeziehungen zwischen ihren Instanzen, und einige Ordnungsbeziehungen können sich sogar über mehrere Typen erstrecken [z. B. wäre es möglich
BigInteger
und möglichBigDecimal
, Vergleichsmethoden zu definieren, die es ermöglichen würden, Instanzen eines Typs in Bezug auf Instanzen des anderen zu ordnen ], aber Es ist im Allgemeinen nicht möglich, zwei willkürliche Instanzen zu nehmen und "Soll X vor, nach oder gleich Y sortieren" zu fragen und eine Gesamtreihenfolge abzuleiten. Es wäre möglich, "Sollte X vor, nach, gleichwertig oder in Bezug auf Y unranked sortieren" zu fragen, ob Objekte eine konsistente Reihenfolge, jedoch keine Gesamtsumme , melden müssenein, aber die meisten Sortieralgorithmen erfordern eine vollständige Reihenfolge. Selbst wenn alle Objekte einecompareTo
Methode implementieren könnten , wenn "unranked" eine gültige Rückgabe wäre, wäre eine solche Methode nicht nützlich genug, um ihre Existenz zu rechtfertigen.quelle