15
Язык программирования JAVA Лекция# 6 (Часть 1) Generics Моисеенко Антон [email protected] СПГУАП Кафедра Информационно-Сетевых Технологий

Java Core. Lecture#6. Part#1. Generics

Embed Size (px)

Citation preview

Page 1: Java Core. Lecture#6. Part#1. Generics

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

Лекция# 6 (Часть 1)Generics

Моисеенко Антон[email protected]

СПГУАПКафедра Информационно-Сетевых Технологий

Page 2: Java Core. Lecture#6. Part#1. Generics

Содержание курса

1. Java до generic-ов 2. Java 53. Сырые типы - Raw types4. Стирание информации в runtime (Type Erasure)

Page 3: Java Core. Lecture#6. Part#1. Generics

Java до generic-ов

List list = new ArrayList();list.add("hello");String s = (String) list.get(0);Integer i = (Integer) list.get(0);

Page 4: Java Core. Lecture#6. Part#1. Generics

Java до generic-ов

•Программисту самому приходилось проверять типы•Компилятор не мог обнаружить ошибки•Ошибки появлялись во время выполнения

(runtime)•Приходилось делать дополнительные

проверки типов с использованием instanceof

Page 5: Java Core. Lecture#6. Part#1. Generics

Java до generic-ов

Когда контейнер поддерживал объекты разных типов, код сильно разрастался…

public class Container {private Object item;

void checkItem() {if (item instanceof SomeClass){

...}

}

Page 6: Java Core. Lecture#6. Part#1. Generics

Java 5

Основная цель введения generic-ов – проверка соответствия типов на этапе компиляции

List<Integer> l = new ArrayList<Integer>();List<List<Integer>> l = new ArrayList<List<Integer>>();

In Java 7:List<List<Integer>> list = new ArrayList<>();

Page 7: Java Core. Lecture#6. Part#1. Generics

Java 5

Основная цель введения generic-ов – проверка соответствия типов на этапе компиляции

List<Integer> l = new ArrayList<Integer>();List<List<Integer>> l = new ArrayList<List<Integer>>();

In Java 7:List<List<Integer>> list = new ArrayList<>();

Page 8: Java Core. Lecture#6. Part#1. Generics

Java 5

Дженерализация классовpublic class Container<T> {

private T item;}

Дженерализация методовpublic class Processor {

<T> T process(T item);<T, E> T process(T item, E smth);

}Компилятор автоматически подставляет типы

Page 9: Java Core. Lecture#6. Part#1. Generics

Сырые типы - Raw types

•Если типы не указывать - коллекции превращаются в т.н. Raw types, где можно хранить элементы любых типов.

•Приведение типов должен обеспечить программист.

List rawList = new ArrayList();List<String> list = new ArrayList<>();

rawList = list; //okList = rawList; //Warning}

Page 10: Java Core. Lecture#6. Part#1. Generics

Сырые типы - Raw types

List rawList = new ArrayList();List<String> list = new ArrayList<>();

rawList = list;rawList.add(8); Что будет?

Page 11: Java Core. Lecture#6. Part#1. Generics

Сырые типы - Raw types

List rawList = new ArrayList();List<String> list = new ArrayList<>();

rawList = list;rawList.add(8); //Warning, no runtime error

String s = list.get(0);

В runtime вся generic-информация стирается!!!

Что будет?До Java7: ClassCastException, no compile errorRuntime error: Type mismatch: cannot convert from Object to String

Компилятор добавляет неявное приведение типов: в данном случае к строке

Page 12: Java Core. Lecture#6. Part#1. Generics

Стирание информации в runtimeType Erasure

•Generics позволяют проверять типы во время компиляции

•Во время исполнения информация про типы не доступна •(но, конечно, можно узнать тип через Reflection API)

Page 13: Java Core. Lecture#6. Part#1. Generics

Стирание информации в runtimeType Erasure

public class SomeType<T> {

public <E> void test(Collection<E> collection) {for (E e: collection) {

System.out.println(e);}

}

public void test(List<Integer> integerList) {for (Integer integer: integerList) {

System.out.println(integer);}

}}

Page 14: Java Core. Lecture#6. Part#1. Generics

Стирание информации в runtimeType Erasure

SomeType someType = new SomeType();List<String> list = Arrays.asList("value");someType.test(list);

Необходимо дженерализировать класс любым типом

SomeType<?> someType = new SomeType<Object>();List<String> list = Arrays.asList("value");someType.test(list);

Если есть generic-и их необходимо использовать, указав хоть какой-нибудь тип!!!

какая реализация метода

test() будет вызываться?ClassCastException:Потому что SomeType создан без generic типа. И компилятор думает, что:public void test(Collection collection)public void test(List integerList)

public class SomeType<T> {

public <E> void test(Collection<E> collection) {for (E e: collection) {

System.out.println(e);}

}

public void test(List<Integer> integerList) {for (Integer integer: integerList) {

System.out.println(integer);}

}}

Page 15: Java Core. Lecture#6. Part#1. Generics

Вопросы?