Допустим, у меня есть класс с объявлением необработанного типа как List (list1). Это просто простой пример:
public class Wildcards {
public boolean contains(List list1, List<?> list2){
/*for(Object element: list1) {
if (list2.contains(element)) {
return true;
}
}*/
list1.add("12sdf34"); //insert String
return false;
}
}
В list1 я вставляю значение String. (Если я использую неограниченные подстановочные знаки для list1, как и для list2, это будет более безопасно, и это будет ошибкой компиляции). Однако здесь сырой тип.
Теперь давайте использовать этот метод следующим образом:
List<Integer> list1 = new ArrayList<Integer>();
List<Double> list2 = new ArrayList<Double>();
System.out.println("Contains? " + (new Wildcards()).contains(list1, list2));
System.out.println("List1 element: " + list1.get(0));
Я не получу никаких ошибок и получу следующий результат:
Содержит? ЛОЖЬ
Элемент List1: 12sdf34
Может ли кто-нибудь объяснить, как это могло быть, когда я инициализировал list1 как список целых чисел?
list1
пусто. Таким образом, ваш циклforeach
никогда не будет введен. И вы не получите ошибку/исключение, потому что дженерики стираются после компиляции< /а>. Во время выполнения все общие параметры заменяются их соответствующей верхней границей илиObject
, если граница не существует. Вопрос относительно вашего кода: почему вы используетеBoolean
вместоboolean
в качестве возвращаемого типа вашего метода? - person Turing85   schedule 25.04.2018