140.00K
Категория: ПрограммированиеПрограммирование

Язык программирования JAVA

1.

Язык программирования
JAVA
Generics

2.

Содержание
Что такое generics? Зачем?
Ошибка выполнения
Преимущества
Ошибка компиляции
Терминалогия
Параметризация
Wildcard
Параметры с ограничениями
Ограничения использования

3.

Что такое generics?
Обобщения (generics) — это параметризированные типы.
Обобщенные:
типы (generic types)
● классы (без enum, исключений, анонимных!)
● интерфейсы (без аннотаций!)
● методы (generic methods)
● конструкторы (generic constructors)

4.

До Java 5.0
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");
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 (справа)
наследовать

18.

Вопросы?
English     Русский Правила