Die Sache ist Ihre Methode Unterschrift
<? extends Object> boolean equals(? extends Object a, ? extends Object b)
wird, die Ihnen keine Optionen nicht geben. Auch wenn Sie
equals(new Date(), "hello world");
der Compiler aufrufen müssen nicht einmal ins Schwitzen brechen und den kleinsten gemeinsamen Vorfahren für Ihre Parametertypen zu bestimmen.
bearbeiten
Interessant. Ich wusste, dass das, was ich oben geschrieben habe, wahr war, aber es sah immer noch ein bisschen komisch aus. Also teste ich
<T> boolean equals(T a, T b) {
return true;
}
<T,E> boolean equals(T a, E b) {
return true;
}
Der Compiler schrie an. Der Grund dafür ist, dass der Compiler in der Tat keinen Unterschied macht und schreibt nur beide Methoden als
boolean equals(? extends Object a, ? extends Object b)
, die nach Typ Löschung
boolean equals(Object a, Object b)
wird, die genau die gleiche Signatur. In der Tat, wenn ich Ihre Methode equals(T,T)
halte und ich eine andere Methode mit der Signatur equals(Object, Object)
hinzufüge, fährt der Compiler fort zu sagen, dass ich die gleiche Methode woanders deklariert habe.
Lange Rede, kurzer, Ihre Methode equals(T,T)
ist die gleiche wie equals(Object, Object)
aufgrund Typ Löschung und daher kann man nicht den gleichen Parametertyp zwingen, zumindest zum Zeitpunkt der Kompilierung, es sei denn Sie speziell equals
Methoden für jede implementieren .
Warum würden Sie das jemals tun wollen? – AJMansfield