Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c =...
-
Upload
chester-johns -
Category
Documents
-
view
219 -
download
2
Transcript of 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 = 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
Road to Generics Класс - ящик для хранения других объектов
class Box { private Object object; void add(Object object) { this.object = object; }
Object get() { return object; }}
3
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
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
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
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
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
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
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
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
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
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
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
Возможны множествовариантов инициализации:
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
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
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
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
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
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
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
References http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html https://sites.google.com/site/io/effective-java-reloaded
22