Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3-й семестр / Лекции / 8 - Презентация

.pdf
Скачиваний:
63
Добавлен:
25.12.2020
Размер:
10.74 Mб
Скачать

Ограниченные типы

Центрдистанционногообучения

 

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