Центрдистанционногообучения
Простые варианты при наследовании
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