Betrachten Sie das folgende Snippet:In Java, leere Sammlungen des gleichen Typs, aber unterschiedliche Typ Parameter immer gleich?
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
assertThat(list1.equals(list2), is(true));
Die Behauptung folgt.
der Tat, soweit ich es verstehe, gibt es keine Möglichkeit in Java, für die equals
Verfahren zwischen den beiden, aufgrund zu unterscheiden Typ-Löschung zu Laufzeit (dh die Tatsache, dass die Typargumente String
und Integer
sind nur zugänglich zur Kompilierzeit, aber nicht zur Laufzeit). Und da es keine Elemente gibt, die verglichen werden könnten, muss equals
wahr zurückgeben. Und bei dieser Denkrichtung muss das für alle Sammlungen stimmen.
Also die Frage ist die folgende: Ist mein Denkprozess korrekt, oder fehlt mir etwas?
EDIT
@qqilihq ein ausgezeichnetes answer gab, die die nächste Frage aufgefordert: Ist dies möglich, ohne vorbei den Typen explizit zu erreichen (ich bin in Ordnung, wenn der Typ gespeichert ist ausdrücklich . irgendwie, nur der Benutzer hat sollte es nicht passieren müssen)
ich versucht, die folgenden, aber es hat nicht funktioniert (ich denke, durch Löschen geben):
public TypedList(List<T> delegate) {
this.delegate = Objects.requireNonNull(delegate);
this.type = (Class<T>) delegate.getClass();
}
Aber vielleicht können Sie etwas Ähnliches tun? this.type = T
. (Dies wird nicht kompiliert, aber möglicherweise ist etwas Ähnliches möglich.)
+1, das ist eine Art, an die ich nicht gedacht habe. Nun, die nächste Frage wäre, dass das möglich ist, um dies zu erreichen, ohne den Typ explizit als Parameter zu übergeben (mir geht es gut, wenn Sie es irgendwie aus 'delegate' extrahieren. Aber ich habe es versucht und gescheitert.) Ich werde die Frage mit diesem neuen Detail bearbeiten. – Attilio
Kurze und negative Antwort: Es ist nicht möglich ** ohne ** den expliziten Typ Token. Die 'Liste' wird zur Laufzeit praktisch nur eine 'List' sein, so dass Informationen einfach nicht da sind. Für den Typ in 'Class ' ist es anders, da es sich um einen" First-Class-Citizen "handelt - auch wenn es zur Laufzeit nur' Class' ist, es enthält immer noch die angegebene Type-Info (zB 'String.class', ...) –
qqilihq
Randnotiz: 'java.util.Collections' folgt genau dem gleichen Prinzip, z In dieser Methode: 'java.util.Collections.checkedList (Liste, Klasse )' - Der Typparameter muss explizit als Argument übergeben werden. –
qqilihq