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

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

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

Особенности параметризованныхЦентрдистанционногообучениятипов

Использовать примитивные типы в качестве параметрических типов нельзя

Если одинаковые настраиваемые типы имеют различные аргументы (типы-параметры), то это различные типы

//несовместимые,различныетипы

Garage<Wheeled> garage; Garage<Crossover> anotherGarage;

Статические компоненты класса не могут использовать его типы-параметры

Также настраиваемый класс не может расширять класс

Throwable

31 online.mirea.ru

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

Стирание типа

В обобщенном коде информация о параметрах-типах

обобщения стирается (это значит, что при использовании обобщения любая конкретная информация о типе теряется )

Тип известен только на стадии компиляции (во время статической проверки типов)

После этого каждый обобщенный тип стирается, то есть заменяется необобщенным верхним ограничением

Компилятор обеспечивает внутреннюю целостность использования типов, контролируя их на «входе» и «выходе», самостоятельно выполняя приведения типов

32 online.mirea.ru

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

Миграционная совместимость

Обобщения не были частью языка с самого начала, и появились только в версии 1.5

Стирание необходимо, чтобы можно было использовать обобщенный клиентский код с необобщенными библиотеками и наоборот

33 online.mirea.ru

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

Расплата за стирание

Операции, для выполнения которых нужно точно знать типы времени выполнения,работать

небудут

• Приведение типов:

(T) var;

• Операция instanceof:

varue instaceof T;

• Операция new

T var = new T();

T[] array = new T[size]

• Создание массива конкретного типа

Type<Integer> arr = new Type<Integer>[10];

34 online.mirea.ru

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

Применение параметризованных типов в классах

class Name <T,E> { private T t; private E e;

public Name(T t, E e) { this.t = t; this.e = e; } public T getT() { return t; }

public void setE(E e) { this.e = e;}

}

class test {

public static void main(String[] args){

Name<String, Integer> obj1 = new Name<String, Integer>("string", 3); String a = obj1.getA();

obj1.setB(10);

Name obj2 = new Name(3, new ArrayList(3)); Integer i = (Integer)obj2.getA();

}

}

35 online.mirea.ru

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

Простые варианты при наследовании

class C1<T>{ T t;

}

class C2<E> extends C1{ E e;

}

class C3<E> extends C1<E> { E e;

}

class C4<E, T> extends C1<T> { E e;

}

class C5<E> extends C1<Integer>{ E e;

}

class C6 extends C1<Integer>{}

C1<String> c1 = new C1<String>(); c1.t имееттип String;

C2<String> c2 = new C2<String>();

c2.t

имееттип

Object;

c2.e

имееттип

String;

C3<String> c3 = new C3<String>();

c3.t

имееттип

String;

c3.e

имееттип

String;

C4<String, Integer> c4

= new

C4<String, Integer>();

 

c4.e имееттип

String;

 

c4.t имееттип

Integer;

 

C5<String> c5 = new C5<String>();

c5.t

имееттип

Integer;

c5.e

имееттип

String;

C6 c6 = new C6();

c6.t имееттип Integer;

36 online.mirea.ru

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

Простые параметризованные типы в интерфейсах

interface IN<T,E> { T meth1 (E e); E meth2 (T t);

}

class CL implements IN{

public Object meth1(Object o) { ... } public Object meth2(Object o) { ... }

}

class CL<T,E> implements IN<T,E> {

class CL<T, E> implements IN {

public T meth1(E e) { ... }

public Object meth1(Object o){}

public E meth2(T t) { ... }

public Object meth2(Object o){}

}

}

class CL<T,E> implements IN<Type1, Type2> { public T meth1(E e) { ... }

public E meth2(T t) { ... }

}

class CL implements IN<Type1, Type2> { public Type1 meth1(Type2 type2) { ... } public Type2 meth2(Type1 type1) { ... }

}

37 online.mirea.ru

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

Особенности параметризованных типов

Тип можно указывать не только для классов и интерфейсов, но

иметодов и конструкторов(не зависимо от того, параметризирован класс и интерфейс или нет

В этом случае тип указывается перед возвращаемым значением

При использовании одинаковых идентификаторов типа у класса

иу метода или конструктора, тип последних скрывает тип класса (интерфейса)

38 online.mirea.ru

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

Простые параметризованные типы в методах и конструкторах

interface GIN <T> {

//Тип-парамескрываметодаинтерфейсапт

 

<T> void meth1 (T t);

 

<E> E meth2 (E e);

//Уметодасвойтип

-параметр

 

T meth3 (T t);

//Методиспользуетнтерфейса

 

}

 

 

 

class GCL<T> implements GIN<T> {

 

 

T t;

}

//Конскрывттипклассаукторет

 

public <T> GCL(T t){

 

public <E> GCL (E e, T t) {

} //Уконсвойтруктораионп

 

//используеттипкласса

 

 

@Override

 

 

 

public <T1> void meth1(T1 t1) { } //реализацияметодабезпутаницы

 

//сименамитипов

-параметров

 

@Override

 

 

 

public <E> E meth2(E e) {return e; }

 

@Override

 

 

39 online.mirea.ru

public T meth3(T t) {return null;}

}

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

Одна из проблем

Если информация о типе стирается, как вызвать определенный метод у объекта имеющего тип – параметр?

class GenericSpeaker<T> { T source;

public void giveVoice() { //source.say(); ошибка компиляции

}

}

40 online.mirea.ru