Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

A Параметризация классов, интерфейсов и методов в Java



К наиболее важным новшествам версии языка 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...