Similar presentations:
Язык программирования JAVA
1.
Язык программированияJAVA
Generics
2.
СодержаниеЧто такое generics? Зачем?
Ошибка выполнения
Преимущества
Ошибка компиляции
Терминалогия
Параметризация
Wildcard
Параметры с ограничениями
Ограничения использования
3.
Что такое generics?Обобщения (generics) — это параметризированные типы.
Обобщенные:
типы (generic types)
● классы (без enum, исключений, анонимных!)
● интерфейсы (без аннотаций!)
● методы (generic methods)
● конструкторы (generic constructors)
4.
До Java 5.0class Box {
private Object item;
public void setItem (Object o) {
item = o;
}
public Object getItem () {
return item;
}
}
public class Test {
public static void main(String[] args) {
Box box = new Box();
box.setItem("hello");
String str1 = (String)box.getItem();
System.out.println(str1);
}
}
Результат выполнения: hello
5.
Ошибка выполненияclass Box {
private Object item;
public void setItem (Object o) {
item = o;
}
public Object getItem () {
return item;
}
}
public class Test {
public static void main(String[] args) {
Box box = new Box();
box.setItem("hello");
Integer int1 = (Integer)box.getItem();
//Exception
System.out.println(int1);
}
}
Результат выполнения: Exception in thread "main"
java.lang.ClassCastException: java.lang.String cannot be cast to
java.lang.Integer
6.
Зачем?Контейнеры
гетерогенные
гомогенные
class Box<T> {
private T item;
public void setItem (T o) {
item = o;
}
public T getItem () {
return item;
}
}
Параметризация
типов
методов
public
конструкторов
class Test {
public static void main(String[] args) {
Box<String> box = new Box<String>();
box.setItem("hello");
String str1 = box.getItem();
System.out.println(str1);
}
}
7.
ПреимуществаОпределение ошибок использования типов на этапе
компиляции.
Использование параметризованных
- типов
- методов
- конструкторов
Использование wildcards
- с ограничениями
- без ограничений
8.
Ошибка компиляциисlass Box<T> {
private T item;
public void setItem (T o) {
item = o;
}
public T getItem () {
return item;
}
}
public class Test {
public static void main(String[] args) {
Box<String> box = new Box<String>();
box.setItem(1234567);//Exception
String str1 = box.getItem();
System.out.println(str1);
}
}
Compilation completed with 1 error Error: java: incompatible types: int
cannot be converted to java.lang.String
9.
ТерминологияGeneric:
class A<T> {…}
класс
public <T> A() {…} конструктор
public <T> T m(T t) {…} метод
T – параметр generic-а
10.
ПараметризацияПодстановка вместо параметра
конкретного
значения при использовании
generic:
Параметризованный класс:
A<String> a = new A<String>();
Обобщения действуют только со
ссылочными типами
11.
Класс с двумя параметрамиclass Box<T, V> {
private T item;
private V item2;
public Box(T o, V o2) {
item = o;
item2 = o2;
}
}
12.
WildcardИспользование generic с указанием
wildcards:
? extends <== extends wildcard
? super <== super wildcard
?
<== unbounded wildcard
class Box<Т> {}
Generic класс:
class Human {
public void
class A<T> {…}
useBox(Box<?> box) {}
}
public class Test {
public static void main(String[] args) {
Box<String> stringBox = new Box<>();
Wildcard параметризованный класс:
Box<Number> numberBox = new Box<>();
Human human = new Human();
A<?> a = new A<String>();
human.useBox(stringBox);
A<? extends Number> a = new human.useBox(numberBox);
}
A<Integer>();
}
A<? super Integer> a = new A<Number>();
13.
Параметры с ограничениямиПри объявлении можно наложить
ограничения на значение параметра generic.
class A <T extends B & J1 & J2> {…}
J1, J2 - интерфейсы
При использовании класса A
если B – интерфейс
T – интерфейс, обязан наследовать B, J1, J2,
если B – класс
T – класс, обязан наследовать B, реализовывать
J1, J2
14.
Ограничение сверхуclass Box <T extends Number>{
private T item;
public void setItem (T o) {
item = o;
}
public Integer getIntValue () {
return item.intValue();
}
}
public class Test {
public static void main(String[] args) {
Box<Float> box = new Box<>();
box.setItem(123.45F);
Integer int1 = box.getIntValue();
System.out.println(int1);
}
}
15.
Обобщенные интерфейсыinterface Box<Т> {
setItem(T item);
}
class BoxImpl implements Box<String> {
public void setItem(String item) {}
}
public class Test {
public static void main(String[] args) {
Box<String> stringBox = new BoxImpl<>();
stringBox.setItem("Hello World");
}
}
16.
Иерархия классовclass Box<Т> {
public void setItem (T item) {}
}
class BigBox<K, T> extends Box<T> {
public void setBigItems(K item, T item2) {}
}
public class Test {
public static void main(String[] args) {
BigBox<String, Integer> stringBox = new BigBox<>();
stringBox.setItem("Very big item", 23);
}
}
17.
Ограничения использованияВнутри generic нельзя:
создать объект этого типа
создать массив такого типа
использовать в секции catch
использовать в статическом
контексте
использовать в instanceof (справа)
наследовать