Слайд 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 {
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 box = new Box();
box.setItem("hello");
String str1 = box.getItem();
System.out.println(str1);
}
}
Слайд 7Преимущества
Определение ошибок использования типов на этапе компиляции.
Использование параметризованных
- типов
-
методов
- конструкторов
Использование wildcards
- с ограничениями
- без ограничений
Слайд 8Ошибка компиляции
сlass Box {
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 box = new Box();
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 {…} класс
public A() {…} конструктор
public T m(T t) {…}
метод
T – параметр generic-а
Слайд 10Параметризация
Подстановка вместо параметра конкретного
значения при использовании generic:
Параметризованный класс:
A a =
new A();
Обобщения действуют только со ссылочными типами
Box box = new Box(); //Error!
Слайд 11Класс с двумя параметрами
class Box {
private T item;
private V item2;
public Box(T o, V o2) {
item = o;
item2 = o2;
}
}
Слайд 12Wildcard
Использование generic с указанием wildcards:
? extends
<== unbounded wildcard
Generic класс:
class A
{…}
Wildcard параметризованный класс:
A> a = new A();
A extends Number> a = new A();
A super Integer> a = new A();
class Box<Т> {}
class Human {
public void useBox(Box> box) {}
}
public class Test {
public static void main(String[] args) {
Box stringBox = new Box<>();
Box numberBox = new Box<>();
Human human = new Human();
human.useBox(stringBox);
human.useBox(numberBox);
}
}
Слайд 13Параметры с ограничениями
При объявлении можно наложить ограничения на значение параметра generic.
class
A {…}
J1, J2 - интерфейсы
При использовании класса A
если B – интерфейс
T – интерфейс, обязан наследовать B, J1, J2,
если B – класс
T – класс, обязан наследовать B, реализовывать J1, J2
Слайд 14Ограничение сверху
class Box
{
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 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 {
public void setItem(String item) {}
}
public class Test {
public static void main(String[] args) {
Box stringBox = new BoxImpl<>();
stringBox.setItem("Hello World");
}
}
Слайд 16Иерархия классов
class Box
{
public void setItem (T item) {}
}
class BigBox extends Box {
public void setBigItems(K item, T item2) {}
}
public class Test {
public static void main(String[] args) {
BigBox stringBox = new BigBox<>();
stringBox.setItem("Very big item", 23);
}
}
Слайд 17Ограничения использования
Внутри generic нельзя:
создать объект этого типа
создать массив такого типа
использовать в
секции catch
использовать в статическом контексте
использовать в instanceof (справа)
наследовать