Я нашел какой-то странный код, где я сказал: «Это никогда не вызывается, потому что он будет бросать класс cast Exception». Ну, код вызывается и работает.Java generic method возвращает другой тип - исключение
Может кто-нибудь объяснить мне: Почему это работает?
Метод getZipList() определяется как возвращающий список строк, но внутренняя логика возвращает список с разными объектами. Также внутри основного метода список строк ожидается как «список», но в списке есть что-то другое.
public class GenericMethodList{
public static void main(String [] args)
{
GenericMethodList o = new GenericMethodList();
List<String> list = o.getZipList(true);
Iterator<?> iter = list.iterator();
while (iter.hasNext()){
ZipCode zipplace = (ZipCode) iter.next();
System.out.println(zipplace.value);
}
}
public List<String> getZipList(boolean someParameter){
//why is this not throwing an exception at runtime?
List list;
if(someParameter){
list = getZipCodes();//List<ZipCode>
} else {
list = getZipStreets();//List<ZipStreet>
}
return list;
}
private List<ZipCode> getZipCodes(){
List<ZipCode> list = new ArrayList<ZipCode>();
list.add(new ZipCode("code1"));
list.add(new ZipCode("code1"));
return list;
}
private List<ZipStreet> getZipStreets(){
List<ZipStreet> list = new ArrayList<ZipStreet>();
list.add(new ZipStreet("street1"));
list.add(new ZipStreet("street2"));
return list;
}
public class ZipCode{
public String value;
public ZipCode(String value){
this.value = value;
}
}
public class ZipStreet {
public String value;
public ZipStreet(String value){
this.value = value;
}
}
}
Благодарим вас за разъяснения.
Спасибо за ваш ответ (все остальные). Я не знал, что компилятор удаляет это (Type Erasure): [http://docs.oracle.com/javase/tutorial/java/generics/erasure.html] Но тогда для меня ясно, почему это работает. И да, я получил предупреждение о компиляторе :-) – Phil