Upload
anton-moiseenko
View
236
Download
0
Embed Size (px)
Citation preview
Язык программирования JAVA
Лекция# 6 (Часть 1)Generics
Моисеенко Антон[email protected]
СПГУАПКафедра Информационно-Сетевых Технологий
Содержание курса
1. Java до generic-ов 2. Java 53. Сырые типы - Raw types4. Стирание информации в runtime (Type Erasure)
Java до generic-ов
List list = new ArrayList();list.add("hello");String s = (String) list.get(0);Integer i = (Integer) list.get(0);
Java до generic-ов
•Программисту самому приходилось проверять типы•Компилятор не мог обнаружить ошибки•Ошибки появлялись во время выполнения
(runtime)•Приходилось делать дополнительные
проверки типов с использованием instanceof
Java до generic-ов
Когда контейнер поддерживал объекты разных типов, код сильно разрастался…
public class Container {private Object item;
void checkItem() {if (item instanceof SomeClass){
...}
}
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<>();
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<>();
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);
}Компилятор автоматически подставляет типы
Сырые типы - Raw types
•Если типы не указывать - коллекции превращаются в т.н. Raw types, где можно хранить элементы любых типов.
•Приведение типов должен обеспечить программист.
List rawList = new ArrayList();List<String> list = new ArrayList<>();
rawList = list; //okList = rawList; //Warning}
Сырые типы - Raw types
List rawList = new ArrayList();List<String> list = new ArrayList<>();
rawList = list;rawList.add(8); Что будет?
Сырые типы - 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
Компилятор добавляет неявное приведение типов: в данном случае к строке
Стирание информации в runtimeType Erasure
•Generics позволяют проверять типы во время компиляции
•Во время исполнения информация про типы не доступна •(но, конечно, можно узнать тип через Reflection API)
Стирание информации в 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);}
}}
Стирание информации в 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);}
}}
Вопросы?