SlideShare a Scribd company logo
Язык программирования
JAVA
Лекция# 6 (Часть 1)
Generics
Моисеенко Антон
canggu@mail.ru
СПГУАП
Кафедра Информационно-Сетевых Технологий
Содержание курса
1. Java до generic-ов
2. Java 5
3. Сырые типы - Raw types
4. Стирание информации в 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; //ok
List = 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 error
Runtime error: Type mismatch: cannot convert
from Object to String
Компилятор добавляет неявное приведение
типов: в данном случае к строке
Стирание информации в runtime
Type Erasure
• Generics позволяют проверять типы во время
компиляции
• Во время исполнения информация про типы не
доступна
• (но, конечно, можно узнать тип через Reflection API)
Стирание информации в runtime
Type 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);
}
}
}
Стирание информации в runtime
Type 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-и их необходимо использовать,
указав хоть какой-нибудь тип!!!
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);
}
}
}
Вопросы?

More Related Content

PPT
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
PPTX
Что могут статические анализаторы, чего не могут программисты и тестировщики
PDF
Tmpa-2014. table-based GLL parsing.
PPTX
Зачем нужна Scala?
PDF
Курс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекции
PPTX
Елена Жукова "Жизнь вне JavaScript"
ODP
Скриптовой язык Groovy и его применение в рамках разработки ПО
PPTX
Система обработки бизнес-логики server-side приложения на Groovy
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
Что могут статические анализаторы, чего не могут программисты и тестировщики
Tmpa-2014. table-based GLL parsing.
Зачем нужна Scala?
Курс Java-2016. Занятие 07. Логи, фасады, библиотеки и коллекции
Елена Жукова "Жизнь вне JavaScript"
Скриптовой язык Groovy и его применение в рамках разработки ПО
Система обработки бизнес-логики server-side приложения на Groovy

Viewers also liked (10)

PPTX
Java Core. Lecture# 3. Part# 1. Abstract classes.
PPTX
Design of Information Systems. Lecture #1. XML
PPT
Java. Lecture 05. Handling Exceptions and Debugging
PPTX
Java Core. Lecture# 3. Part# 2. Exceptions.
PPS
Exceptions
PDF
ABOUT PACKAGES
PPTX
Async clinic by by Sergey Teplyakov
PPTX
Массивы в Java
PPT
Maven как средство сборки проекта
PPTX
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Java Core. Lecture# 3. Part# 1. Abstract classes.
Design of Information Systems. Lecture #1. XML
Java. Lecture 05. Handling Exceptions and Debugging
Java Core. Lecture# 3. Part# 2. Exceptions.
Exceptions
ABOUT PACKAGES
Async clinic by by Sergey Teplyakov
Массивы в Java
Maven как средство сборки проекта
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Ad

Similar to Java Core. Lecture#6. Part#1. Generics. (6)

PDF
Tricky Java Generics
PPT
Java Generics: What it is and How to Implement it
PPT
10. java lecture generics&collections
PDF
05 - Java. Collections Framework и Generics
PPT
Oop java.generics
PDF
Курс Java-2016. Занятие 04 (часть 1). Еще немного про Generics
Tricky Java Generics
Java Generics: What it is and How to Implement it
10. java lecture generics&collections
05 - Java. Collections Framework и Generics
Oop java.generics
Курс Java-2016. Занятие 04 (часть 1). Еще немного про Generics
Ad

More from Anton Moiseenko (7)

PPTX
Java core-lect6-part3-annotation.ppt
PPTX
Java core-lect6-part2-reflection-api.ppt
PPTX
Java Core. Lecture# 5. Concurrency.
PPTX
Java Core. Lecture# 4. Collections.
PPTX
Java Core. Lecture# 3. Part# 3. Multithreading.
PPTX
Java Core. Lecture# 2. Classes & objects.
PPTX
Java Core. Lecture# 1. Intro
Java core-lect6-part3-annotation.ppt
Java core-lect6-part2-reflection-api.ppt
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 4. Collections.
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 1. Intro

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

  • 1. Язык программирования JAVA Лекция# 6 (Часть 1) Generics Моисеенко Антон canggu@mail.ru СПГУАП Кафедра Информационно-Сетевых Технологий
  • 2. Содержание курса 1. Java до generic-ов 2. Java 5 3. Сырые типы - Raw types 4. Стирание информации в runtime (Type Erasure)
  • 3. Java до generic-ов List list = new ArrayList(); list.add("hello"); String s = (String) list.get(0); Integer i = (Integer) list.get(0);
  • 4. Java до generic-ов • Программисту самому приходилось проверять типы • Компилятор не мог обнаружить ошибки • Ошибки появлялись во время выполнения (runtime) • Приходилось делать дополнительные проверки типов с использованием instanceof
  • 5. Java до generic-ов Когда контейнер поддерживал объекты разных типов, код сильно разрастался… public class Container { private Object item; void checkItem() { if (item instanceof SomeClass){ ... } }
  • 6. 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<>();
  • 7. 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<>();
  • 8. 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); } Компилятор автоматически подставляет типы
  • 9. Сырые типы - Raw types • Если типы не указывать - коллекции превращаются в т.н. Raw types, где можно хранить элементы любых типов. • Приведение типов должен обеспечить программист. List rawList = new ArrayList(); List<String> list = new ArrayList<>(); rawList = list; //ok List = rawList; //Warning }
  • 10. Сырые типы - Raw types List rawList = new ArrayList(); List<String> list = new ArrayList<>(); rawList = list; rawList.add(8);
  • 11. Сырые типы - 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 error Runtime error: Type mismatch: cannot convert from Object to String Компилятор добавляет неявное приведение типов: в данном случае к строке
  • 12. Стирание информации в runtime Type Erasure • Generics позволяют проверять типы во время компиляции • Во время исполнения информация про типы не доступна • (но, конечно, можно узнать тип через Reflection API)
  • 13. Стирание информации в runtime Type 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); } } }
  • 14. Стирание информации в runtime Type 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-и их необходимо использовать, указав хоть какой-нибудь тип!!! 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); } } }