Обобщенные типы и методы
Нередко создаваемые разработчиками алгоритмы могут быть успешно использованы для
разных типов данных без какого-либо изменения. И чтобы не создавать одну и туже реализацию
для каждого типа данных в языке Java были введены обобщения или обобщенные типы.
Обобщенные типы позволяют создавать более безопасный и при этом универсальный код.
Но прежде чем перейти к рассмотрению обобщенных типов, посмотрим на проблему,
которая могла возникнуть до их появления:
int x = 44;
String s = "hello";
java.util.ArrayList array = new java.util.ArrayList();
// Упаковка значения x в тип Object
array.add(x);
// Упаковка значения s в тип Object
array.add(s);
// Распаковка в значение типа int первого элемента коллекции
int y = (int)array.get(0);
System.out.println(y);
В данном случае используется класс ArrayList из пакета java.util, который представляет
коллекцию объектов. Чтобы поместить объект в коллекцию, применяется метод add. И хотя мы
добавляем в коллекцию числа и строки, но по существу ArrayList содержит коллекцию значений
типа Object. Таким образом, в вызовах array.add(x); и array.add(s); значения переменных x и s
вначале "упаковываются" в значения типа Object, потом при получении элементов из коллекции -
наоборот, "распаковываются" в нужный тип. Упаковка и распаковка (boxing и unboxing) ведут к
снижению
производительности,
поскольку
система
должна
выполнить
необходимые
преобразования.
Существует и другая проблема, связанная с упаковкой-распаковкой, - проблема
безопасности типов. Например, во время выполнения следующего кода мы получим ошибку:
int y = (int)array.get(1);
Все эти проблемы призваны решить обобщенные типы. Обобщенные типы позволяют
указать конкретный тип данных, который будет использоваться. Например, используем
обобщенный вариант класса ArrayList:
int x = 44;
String s = "hello";
java.util.ArrayList array = new java.util.ArrayList();
array.Add(x);
// Распаковка уже не нужна
int y = array[0];
// здесь будет ошибка, так как можно добавлять только объекты int
array.Add(s);
Так как в данном случае мы использовали обобщенную версию класса ArrayList, то нам
нужно задать в выражении <тип> тип данных, для которого этот класс будет применяться. Далее
мы добавляем число и строку в коллекцию. Но если число будет добавлено в коллекцию array,
так как коллекция типизирована типом int, то на строке array.Add(s); мы получим ошибку во
время компиляции и должны будем удалить эту строку. Таким образом, при применении
обобщенного варианта класса снижается как количество потенциальных ошибок, так и время на
выполнение.
При создании объекта обобщенного типа с помощью конструктора в последних версиях Java
второй раз тип можно не указывать, например:
java.util.ArrayList array = new
java.util.ArrayList<>();
Теперь создадим и используем свой обобщенный класс Bank:
public class GenericsApp {
public static void main(String[] args) {
Bank bank = new Bank(new Integer[] { 1, 2, 4, 5, 6 });
Bank bank2 = new Bank(new String[] {"13433", "342454", "21432"});
}
}
class Bank{
T[] clients;
public Bank()
{
}
public Bank(T[] _clients)
{
this.clients = _clients;
}
}
С помощью буквы T в определении класса class Bank мы указываем, что данный тип T
будет использоваться этим классом. Параметр T в угловых скобках называется универсальным
Do'stlaringiz bilan baham: |