Angenommen, haben wir die folgende generische KlasseWelche der überladenen Methoden werden zur Laufzeit aufgerufen, wenn wir Typ löschen anwenden, und warum?
public class SomeType<T> {
public <E> void test(Collection<E> collection){
System.out.println("1st method");
for (E e : collection){
System.out.println(e);
}
}
public void test(List<Integer> integerList){
System.out.println("2nd method");
for (Integer integer : integerList){
System.out.println(integer);
}
}
}
nun im Inneren des Hauptverfahrens haben wir die folgenden Code
SomeType someType = new SomeType();
List<String> list = Arrays.asList("value");
someType.test(list);
Als Ergebnis der Ausführung someType.test(list)
Schnipsel werden wir „2. Methode“ in unserer Konsole bekommen als sowie java.lang.ClassCastException
. Wie ich verstehe, ist der Grund, warum zweite test
Methode ausgeführt wird, dass wir keine Generika für SomeType
verwenden. Der Compiler entfernt also sofort alle Generika-Informationen aus der Klasse (d. H. Sowohl <T>
als auch <E>
). Nach dieser zweiten test
Methode wird List integerList
als Parameter haben und natürlich List
passt besser zu List
als zu Collection
.
Betrachten wir nun, dass im Inneren des Hauptverfahrens haben wir den folgenden Code-Snippet
SomeType<?> someType = new SomeType<>();
List<String> list = Arrays.asList("value");
someType.test(list);
In diesem Fall werden wir „erste Methode“ in der Konsole. Es bedeutet, dass die erste Testmethode ausgeführt wird. Die Frage ist warum?
Von meinem Verständnis zur Laufzeit haben wir nie Generika-Informationen wegen Typ löschen. Also, warum dann zweite test
Methode kann nicht ausgeführt werden. Für mich zweite test
Methode sollte (zur Laufzeit) in der folgenden Form sein public void test(List<Integer> integerList){...}
Ist es nicht?
Wir haben keine Generika-Informationen zur Laufzeit, aber die Methodenwahl wird zur Laufzeit nicht getroffen. – user2357112
Ok, aber wie ist die Methodenwahl? Gibt es bestimmte Informationen im Bytecode, die jvm mitteilen, welche Methode aufgerufen werden soll? – ruvinbsu
@ruvinbsu, da der Compiler entscheidet, welche Methode er aufrufen sollte, ja. – SomeJavaGuy