Ich habe diese von einem Google I/O Puzzler sprechen gegeben von Joshua Bloch. Hier ist der CodeJava Generics Typ Löschung der Methode Parameter
public class Glommer<T> {
String glom(Collection<?> obj){
String result = "";
for(Object o : obj){
result += o;
}
return result;
}
int glom(List<Integer> ints){
int result = 0;
for(int i : ints){
result += i;
}
return result;
}
public static void main(String args[]){
List<String> strings = Arrays.asList("1", "2", "3");
System.out.println(new Glommer().glom(strings));
}
diese Haupt Methode löst eine Ausnahme, weil new Glommer
eine rohe Art ist und somit alle Generika in Glommer
gelöscht wird, so es endet Aufruf int glom(List<Integer> ints)
statt String glom(Collection<?> obj)
.
Meine Frage ist, auch wenn ich glom()
als new Glommer<Integer>().glom(strings)
sollte nicht nennen es die int glom(List<Integer> ints)
Methode genannt, da aufgrund Löschen geben, ist diese Methode effektiv int glom(List ints)
und strings
ist vom Typ List
nicht Collection
?
Ich würde sagen, dass der Compiler die Signatur der auszuführenden Methode bestimmt, aber eine Methode zur Ausführung wird zur Laufzeit unter Verwendung des tatsächlichen Objekttyps gewählt. – tcb
@tcb Ich habe ein Beispiel hinzugefügt, probieren Sie es aus. – WilQu
Ich verstehe, was Sie sagen möchten und in diesem Beispiel sind Sie richtig, aber meine Worte waren über einen allgemeinen Fall, in dem Sie eine abgeleitete Klasse mit überschriebenen Methoden haben können. – tcb