Центрдистанционногообучения
Маски
\\Метод компилируется
public static List<?> getList() {
List<Fruit> fruits = new ArrayList<Fruit>(); fruits.add(new Apple());
return fruits;
}
List<?> wFruits1 = getList(); \\Работает
List<Fruit> wFruits2 = getList(); |
\\Ошибка компиляции |
List<Apple> wFruits3 = getList(); |
\\Ошибка компиляции |
51 online.mirea.ru
Центрдистанционногообучения
Маски
public static void addToList(List<?> fruits) {
\\add не работают все fruits.add(new Fruit()); fruits.add(new Apple()); fruits.add(new Citrus()); fruits.add(new Orange());
Object o = fruits.get(0); \\работает
\\остальные get не работают
Fruit f = fruits.get(0); Citrus c = fruits.get(0); Orange or = fruits.get(0);
}
//все вызовы не вызывают ошибки компиляции
addToList(new ArrayList<Fruit>()); addToList(new ArrayList<Apple>()); addToList(new ArrayList<Citrus>()); addToList(new ArrayList());
52 online.mirea.ru
Центрдистанционногообучения
Ограничение снизу
•Определяет ограничение супертипа
•<? super sub>
•Некоторый конкретный тип, параметр которого является суперклассом для sub
53 online.mirea.ru
Центрдистанционногообучения
• Имеется:
Проблема
List<Integer> list = new ArrayList<Integer>(); Map<Integer, Comparable<String>> m =
new HashMap<Integer,Comparable<String>>();
// Зачемдварписатьзаоднотоже???
• Хотелось бы:
List<Integer> list = new ArrayList<>(); Map<Integer, Comparable<String>> m =
new HashMap<>();
54 online.mirea.ru
Центрдистанционногообучения
Вывод типа (type inference) (Java 1.7)
• Можно использовать, если компилятор из контекста может понять, какие типы нужны
• <> – «алмазная запись» (diamond notation)
• В основном используется при создании объектов в ходе инициализации переменных
• При создании объектов нельзя путать отсутствие указания типа (будет обобщенный тип) и оператор алмаз (будет вывод типа)
• Из-за механизма стирания в параметризованных типах могут возникать непроверяемые компилятором приведения
55 online.mirea.ru