Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
К наиболее важным новшествам версии языка J2SE 5 можно отнести появление параметризованных (generic) классов и методов, позволяющих использовать более гибкую и в то же время достаточно строгую типизацию, что особенно важно при работе с коллекциями. Параметризация позволяет создавать классы, интерфейсы и методы, в которых тип обрабатываемых данных задается как параметр.
Приведем пример generic-класса с двумя параметрами:
/*пример # 9: объявление класса с двумя параметрами: Subject.java */
package chapt03;
public class Subject <T1, T2> {
private T1 name;
private T2 id;
public Subject() {
}
public Subject(T2 ids, T1 names) {
id = ids;
name = names;
}
}
Здесь T1, Т2 – фиктивные объектные типы, которые используются при
объявлении членов класса и обрабатываемых данных. При создании объекта
компилятор заменит все фиктивные типы на реальные и создаст соответствующий
им объект. В качестве параметров классов запрещено применять базовые типы.
Объект класса Subject можно создать, например, следующим образом:
Subject<String,Integer> sub =
new Subject<String,Integer>();
char ch[] = {'J','a','v','a'};
Subject<char[],Double> sub2 =
new Subject<char[],Double>(ch, 71D);
В объявлении sub2 имеет место автоупаковка значения 71D в Double.
Параметризированные типы обеспечивают типовую безопасность.
Ниже приведен пример параметризованного класса Optional с
конструкторами и методами, также инициализация и исследование поведения
объектов при задании различных параметров.
/*пример # 10: создание и использование объектов параметризованного
класса: Optional.java: Runner.java */
package chapt03;
public class Optional <T> {
private T value;
public Optional() {
}
public Optional(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T val) {
value = val;
}
public String toString() {
if (value == null) return null;
return value.getClass().getName() + " " + value;
}
}
package chapt03;
public class Runner {
public static void main(String[] args) {
//параметризация типом Integer
Optional<Integer> ob1 =
new Optional<Integer>();
ob1.setValue(1);
//ob1.setValue("2");// ошибка компиляции: недопустимый тип
int v1 = ob1.getValue();
System.out.println(v1);
//параметризация типом String
Optional<String> ob2 =
new Optional<String>("Java");
String v2 = ob2.getValue();
System.out.println(v2);
//ob1 = ob2; //ошибка компиляции – параметризация не ковариантна
//параметризация по умолчанию – Object
Optional ob3 = new Optional();
System.out.println(ob3.getValue());
ob3.setValue("Java SE 6");
System.out.println(ob3.toString());/* выводится
тип объекта, а не тип параметризации */
ob3.setValue(71);
System.out.println(ob3.toString());
ob3.setValue(null);
}
}
В результате выполнения этой программы будет выведено:
Java
null
java.lang.String Java SE 6
java.lang.Integer 71
В рассмотренном примере были созданы объекты типа Optional: ob1 на
основе типа Integer и ob2 на основе типа String при помощи различных
конструкторов. При компиляции вся информация о generic-типах стирается и
заменяется для членов класса и методов заданными типами или типом Object,
если параметр не задан, как для объекта ob3. Такая реализация необходима для
обеспечения совместимости с кодом, созданным в предыдущих версиях языка.
Объявление generic-типа в виде <T>, несмотря на возможность
использовать любой тип в качестве параметра, ограничивает область
применения разрабатываемого класса. Переменные такого типа могут вызывать
только методы класса Object. Доступ к другим методам ограничивает
компилятор, предупреждая возможные варианты возникновения ошибок.
Дата публикования: 2015-02-03; Прочитано: 1243 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!