Dostałem ten jeden z pogawędki układanki we/wy Google podanej przez Joshua Blocha. Oto kodUsuwanie typów generycznych Java z parametrów metody
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));
}
to główna metoda zgłasza wyjątek, ponieważ new Glommer
to rodzaj surowego i stąd wszystkie leki generyczne w Glommer
zostanie skasowany, więc kończy się wywołaniem int glom(List<Integer> ints)
zamiast String glom(Collection<?> obj)
.
Moje pytanie brzmi, nawet jeśli zadzwoniłem glom()
jak new Glommer<Integer>().glom(strings)
nie powinno wywołać metodę int glom(List<Integer> ints)
ponieważ ze względu na typ skasowaniu, metoda ta jest skutecznie int glom(List ints)
i strings
jest typu List
nie Collection
?
Powiedziałbym, że kompilator określa podpis metody do wykonania, ale metoda do wykonania jest wybierana w środowisku wykonawczym przy użyciu rzeczywistego typu obiektu. – tcb
@ tcb Dodałem przykład, spróbuj. – WilQu
Rozumiem, co chcesz powiedzieć iw tym przykładzie masz rację, ale moje słowa dotyczyły ogólnego przypadku, w którym możesz mieć klasę pochodną z nadpisanymi metodami. – tcb