+ All Categories
Home > Documents > Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c =...

Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c =...

Date post: 14-Jan-2016
Category:
Upload: chester-johns
View: 215 times
Download: 2 times
Share this document with a friend
22
Saint Petersburg, 2011 Java Lecture Generics
Transcript
Page 1: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Saint Petersburg, 2011

Java Lecture

Generics

Page 2: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Quiz

ArrayList lst = new ArrayList();Collection c = lst;

lst.add("one");lst.add(“two");lst.add(“three"); lst.remove(0);c.remove(0);

System.out.println(lst.size());System.out.println(c.size());

2

Page 3: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Road to Generics Класс - ящик для хранения других объектов

class Box { private Object object; void add(Object object) { this.object = object; }

Object get() { return object; }}

3

Page 4: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Road to Generics Класс - ящик для хранения других объектов

class Box { private Object object; void add(Object object) { this.object = object; }

Object get() { return object; }}

При использовании необходимо кастовать к нужному типу, это небезопасноBox integerBox = new Box();integerBox.add(new Integer(10));Integer someInteger = (Integer) integerBox.get();

4

Page 5: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Road to Generics Класс - ящик для хранения других объектов

class Box { private Object object; void add(Object object) { this.object = object; }

Object get() { return object; }}

При использовании необходимо кастовать к нужному типу, это небезопасноBox integerBox = new Box();integerBox.add(new Integer(10));integerBox.add(”10”);Integer someInteger = (Integer) integerBox.get(); //Exception!!!

5

Page 6: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Road to Generics Можно защититься, но это неудобно:

Box integerBox = new Box();Object content = integerBox.get();

if (content instanceof Integer) { Integer someInteger = (Integer)integerBox.get(); System.out.println(someInteger + 5);}

6

Page 7: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Road to Generics Можно защититься, но это неудобно:

Box integerBox = new Box();Object content = integerBox.get();

if (content instanceof Integer) { Integer someInteger = (Integer)integerBox.get(); System.out.println(someInteger + 5);}

7

Page 8: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Road to Generics Generics: we can do it safe and clear!

class Box<T> { private T object; void add(T object) { this.object = object; }

T get() { return object; }}

8

Page 9: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Road to Generics Generics: we can do it safe and clear!

class Box<T> { private T object; void add(T object) { this.object = object; }

T get() { return object; }}

Соответственно, использование изменится к лучшему:Box<Integer> integerBox = new Box<Integer>();integerBox.add(new Integer(10));Integer someInteger = integerBox.get();

9

Page 10: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Generic classes Generics: we can do it safe and clear!

class Box<T> { private T object; void add(T object) { this.object = object; }

T get() { return object; }}

Соответственно, использование изменится к лучшему:Box<Integer> integerBox = new Box<Integer>();integerBox.add(new Integer(10));integerBox.add(”10”); // Не компилируетсяInteger someInteger = integerBox.get(); String someInteger = integerBox.get(); // Не компилируется

10

Page 11: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Generic methods Также можно объявлять generic методы:

class Box<T> { private T object; void add(T object) { this.object = object; }

T get() { return object; }

<U> void inspect(U u) { System.out.println("U: " + u.getClass().getName()); }}

11

Page 12: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Generic methods Также можно объявлять generic методы:

class Box<T> { private T object; void add(T object) { this.object = object; }

T get() { return object; }

static <U> void fillBoxes(U u, List<Box<U>> boxes) { for (Box<U> box : boxes) {

box.add(u); }}

}

Box.<Integer>fillBoxes(42, new ArrayList<Box<Integer>>());

12

Page 13: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Wildcards Generic types are invariant

List<Integer> не наследует List<Object>:Integer[] iArray = {1, 3, 2};Object[] oArray = iArray; // OK

List<Integer> iList = new ArrayList<Integer>();List<Object> oList = iList; // Не компилируется

13

Page 14: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Wildcards Generic types are invariant

List<Integer> не наследует List<Object>:Integer[] iArray = {1, 3, 2};Object[] oArray = iArray;

List<Integer> iList = new ArrayList<Integer>();List<Object> oList = iList; //Не компилируется

Чтобы решить эту проблему, можно использовать wildcard: <?> – любой класс <? extends Number> – ограничение снизу: все классы, которые являются

наследниками Number <? super Number> – ограничение сверху: все классы, являющиеся родителями

класса Number

14

Page 15: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Возможны множествовариантов инициализации:

List<? extends Number> list1 = new ArrayList<Integer>();List<? extends Number> list2 = new ArrayList<Number>();

List<? super Number> list3 = new ArrayList<Object>();List<? super Number> list4 = new ArrayList<Number>();

List<Integer> is a subtype of List<? extends Number>List<Object> is a subtype of List<? super Number>

Когда какой wildcard использовать?

15

Page 16: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

PECS rule PECS — Producer Extends , Consumer Super

use Foo<? extends T> for a T producer use Foo<? super T> for a T consumer don’t use ? for return type

16

Page 17: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

PECS rule PECS — Producer Extends , Consumer Super

use Foo<? extends T> for a T producer use Foo<? super T> for a T consumer don’t use ? for return type

Пример Stack<E>:

void pushAll(Collection<? extends E> src);

– src is an E producer

void popAll(Collection<? super E> dst);

– dst is an E consume

17

Page 18: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

PECS rule Как можно будет использовать объекты внутри метода?

void pushAll(Collection<? extends Number> src) { dst.add(1); // Не компилируется

for (Number n : src) { System.out.println(n); }

for (Object o : dst) { System.out.println(o); }}

void popAll(Collection<? super Number> dst) { dst.add(new Float(1.2)); for (Number n : dst) { // Не компилируется System.out.println(n); }}

18

Page 19: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

PECS ruleКак можно будет использовать объекты внутри метода?

void pushAll(Collection<? extends Number> src) { dst.add(1); // Не компилируется

for (Number n : src) { System.out.println(n); }}

void popAll(Collection<? super Number> dst) { dst.add(new Float(1.2)); for (Number n : dst) { // Не компилируется System.out.println(n); }

for (Object o : dst) { System.out.println(o); }}

19

Page 20: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Wildcards in use Что можно буедт пердавать в метод?

void pushAll(Collection<? extends E> src);void popAll(Collection<? super E> dst);

pushAll(new ArrayList<Integer>());pushAll(new ArrayList<Number>());pushAll(new ArrayList<Object>());

popAll(new ArrayList<Integer>());popAll(new ArrayList<Number>());popAll(new ArrayList<Object>());

20

Page 21: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

Wildcards in use Что можно буедт пердавать в метод?

void pushAll(Collection<? extends E> src);void popAll(Collection<? super E> dst);

pushAll(new ArrayList<Integer>());pushAll(new ArrayList<Number>());pushAll(new ArrayList<Object>()); // Не компилируется

popAll(new ArrayList<Integer>()); // Не компилируетсяpopAll(new ArrayList<Number>());popAll(new ArrayList<Object>());

21

Page 22: Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");

References http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html https://sites.google.com/site/io/effective-java-reloaded

22


Recommended