
3-й семестр / Лекции / 8 - Презентация
.pdf
Ограниченные типы |
Центрдистанционногообучения |
|
interface Speaker { void say()
}
class Cat implements Speaker{
public void say() { System.out.println("maaauuuu"); }
}
class GenericSpeaker<T extends Speaker> { T source;
public void giveVoice() { source.say();
}}
•Ограничение типа позволяет использовать у ссылок методы и поля, доступные в типе-ограничителе
•Типы, не наследующие от указанного, не могут быть использованы при создании объектов
41 online.mirea.ru

Ограниченные типы |
Центрдистанционногообучения |
|
Class Name<T extends ClassName &
Interface1 & Interface2 & … > {...}
•Как имя типа может быть указан 1 класс и множество интерфейсов, разделенных &.
•Как имя типа может быть указан ранее введенный параметр.
class GenericClass<T extends Comparable<T>> {...}
42 online.mirea.ru

Центрдистанционногообучения
Маски
•Что делать при передаче экземпляров параметризованных типов в методы, т.е. как писать сигнатуру?
•Для этого используется маска <?>, обозначающая
произвольный тип-параметр
class Generic<T> {
...
boolean compare(Generic<?> o) { return o.getObj() == obj;
}
43 online.mirea.ru

Центрдистанционногообучения
Запись
Маски
boolean compare(Generic<?> o) {…}
означает, что в качестве параметра методу compare может быть передан тип Generic, параметризированный любым (а не конкретным, как если бы было Generic<T>) типом.
isEqual = compare(Generic<Integer> o); isEqual = compare(Generic<Runnable> o); isEqual = compare(Generic<StringBuilder> o); isEqual = compare(Generic<Calendar> o); isEqual = compare(Generic<K> o);
44 online.mirea.ru

Центрдистанционногообучения
Маски
Маски позволяют задать отношение между
параметризтипами,не рованными типами-параметрами
//пустьестьиерархия class Fruit {}
class Apple extends Fruit{}
class Citrus extends Fruit{}
class Orange extends Citrus{}
Fruit
Citrus |
|
Apple |
|
|
|
Orange
45 online.mirea.ru

Центрдистанционногообучения
Маски
List<?> fruits = new ArrayList<Fruit>();
//Все методы add не работают с ошибкой компиляции
//add(capture<?>) в List не может быть применен к <Тип_добавляемого_объекта>
fruits.add(new Object()); fruits.add(new Fruit()); fruits.add(new Apple()); fruits.add(new Citrus()); fruits.add(new Orange());
//Этот метод работает
Object o = fruits.get(0);
//Остальные методы get не работают, потому что get возвращает Object и нужно
приводить объект у нужному типу
Fruit f = fruits.get(0); Apple a = fruits.get(0); Citrus c = fruits.get(0); Orange or = fruits.get(0);
46 online.mirea.ru

Центрдистанционногообучения
\\МетодМаскикомпилируется
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(); \\Ошибка компиляции
47 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());
48 online.mirea.ru

Центрдистанционногообучения
Ограничение сверху
nОпределяет отношение восходящего преобразования
n<? extends super>
nНекоторый конкретный тип, параметр которого наследуется от super
49 online.mirea.ru

Центрдистанционногообучения
? extends Super
List<? extends Fruit> fruits = new ArrayList<Fruit>();
//Все методы add не работают с ошибкой компиляции
fruits.add(new Object()); fruits.add(new Fruit()); fruits.add(new Apple()); fruits.add(new Citrus()); fruits.add(new Orange());
//Этот метод работает
Object o = fruits.get(0);
//Остальные методы get не работают, потому что get возвращает Object и нужно приводить объект у нужному типу
Fruit f = fruits.get(0); Apple a = fruits.get(0); Citrus c = fruits.get(0); Orange or = fruits.get(0);
50 online.mirea.ru