Generics (обобщения) в Java
Generics (обобщения типов данных) в Java описываются
следующим образом:
•Обеспечивают безопасность приведения типов во время компиляции
•Исключают необходимость в постоянном приведении типов
•Обеспечивается возможность создания однородных
коллекций.
Generics
Коллекция без использования Generics:
ArrayList list = new ArrayList(); list.add(0, new Integer(42));
int total = ((Integer)list.get(0)).intValue();
Коллекция с использованием Generics:
ArrayList<Integer> list = new ArrayList<Integer>(); list.add(0, new Integer(42));
int total = list.get(0).intValue();
Пример с обобщением на коллекции Set
1import java.util.*;
2public class GenSetExample {
3 |
public static void main(String[] args) { |
4 |
Set<String> set = new HashSet<String>(); |
5 |
set.add("one"); |
6 |
set.add("second"); |
7 |
set.add("3rd"); |
8 |
|
9 |
// Эта строка приведет к ошибке компиляции |
10 |
set.add(new Integer(4)); |
11 |
set.add("second"); // Дубликат, не добавляется |
12 |
|
13 |
System.out.printIn(set); |
14}
15}
Пример с обобщением на коллекции Map
import java.util.*;
public class MapPlayerRepository { HashMap<String, String> players;
public MapPlayerRepository() {
players = new HashMap<String, String>();
}
public String get(String position) {
String player = players.get(position); return player;
}
public void put(String position, String name) { players.put(position, name);
}
}
Варианты использования Generics
Категория |
Без обобщений |
С обобщениями |
|
|
public class ArrayList |
public class ArrayList<E> |
|
Объявление класса |
extends AbstractList |
extends AbstractLlst<E> |
|
|
implements List |
implements List <E> |
|
|
|
|
|
Объявление |
public ArrayList(int capacity); |
public ArrayLlst<E> (int capacity); |
|
конструктора |
|||
|
|
||
|
|
|
|
Объявление метода |
public void add( (Object) o) |
public void add(E o) |
|
public Object get(int Index) |
public E get(int index) |
||
|
|
|
|
Примеры объявления |
ArrayList list1; |
ArrayList <String> list1; |
|
переменных |
ArrayList list2; |
ArrayList <Date> list2; |
|
|
|
||
|
|
|
|
Создание экземпляров |
list1 = new ArrayList(10); |
list1 = new ArrayList<String> (10); |
|
классов |
list2 = new ArrayList(10); |
list2 = new ArrayList<Date> (10); |
|
|
|
||
|
|
|
Обобщения в механизме коллекций
Обобщенное программирование
Обобщенное программирование – написание кода,
который многократно может быть использован с
объектами различных типов.
Три уровня:
•Использование готовых обобщений
ArrayList<E> и так далее.
•Изучение и создание кода, использующего готовые обобщения
•Написание своих собственных обобщенных классов
Обобщенный класс
public class Pair<T> { private T first; private T second; public Pair () {};
public Pair(T first, T second) {}; public T getFirst(){ return first; } public void setFirst(T first) {}
}
...
public class Main {
Pair<String> pair = new Pair<String>();
}
Обобщенный метод
class ArrayAlg {
public static <T> T getMiddle(T[] a) { return a[a.length/2];
}
}
// вызов обобщенного метода
ArrayAlg.<String>getMiddle(new String[]{“aa”,”bb”});
Если нет неоднозначности и компилятор однозначно по
типу параметров может определить вызываемый метод, то
нет необходимости писать <String>.
<Т> Т getMiddle(T[] а); ArrayAlg.getMiddle(new String[]{“aa”,”bb”});
<Т>Т getMiddle(T... а); ArrayAIg.getMiddle(103.1, 10, 5); // ошибка