Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_02.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
278.09 Кб
Скачать

29. Обобщения (Generic)

Java поддерживает обобщения. Обобщенными бывают классы, методы и интерфейсы. Обобщения нужны для того, чтобы предоставить реализацию не зависящую от типов данных. Например, обобщенный класс может предоставлять обработку разнотипных данных. Обобщения работают только с объектами. Аналогия обобщений в С++ - шаблоны.

Особености:

  • Обобщения принимают только ссылочные типы. Что бы использовать примитивные типы в обобщениях существуют оберточные классы.

  • <T extends D> означает что в данов обобщении мы сможем использовать только объекты класса производного от класса D.

  • Создавать объект параметризованого типа нельзя.

пример с обобщением.

class Gen<T> {

T ob; // объявление объекта типа T

// Передать конструктору ссылку на объект типа T

Gen(T o) {

ob = o;

}

// Вернуть ob

T getob() {

return ob;

}

// Показать тип T

void showType() {

System.out.println("Тип T: " + ob.getClass().getName());

}

}

// Код для кнопки

// Работаем с обобщённым классом

// Создаём Gen-ссылку для Integer

Gen<Integer> iOb;

// Создаём объект Gen<Integer>

iOb = new Gen<Integer>(77);

// Показать тип данных, используемый iOb

iOb.showType();

// Получить значение iOb

int value = iOb.getob();

System.out.println("Значение " + value);

// Создадим объект Gen для String

Gen<String> strOb = new Gen<String>("Обобщённый текст");

// Показать тип данных, используемый strOb

strOb.showType();

// Получить значение strOb

String str = strOb.getob();

System.out.println("Значение: " + str);

РАЗБОР КОДА

class Gen<T> {

}

В угловых скобках используется T - имя параметра типа. Это имя используется в качестве заполнителя, куда будет подставлено имя реального типа, переданного классу Gen при создании реальных типов. Угловые скобки указывают, что параметр может быть обобщён. Сам класс при этом называется обобщённым классом или параметризованным типом.

T ob; // объявляет объект типа T

Вместо T подставится реальный тип, который будет указан при создании объекта класса Gen. Объект ob будет объектом типа, переданного в параметре типа T. Если в параметре T передать тип String, то экземпляр ob будет иметь тип String.

конструктор Gen().

Get(T o) {

ob = o;

}

Параметр o имеет тип T. Это значит, что реальный тип параметра o определяется типом, переданным параметром типа T при создании объекта класса Gen.

Параметр типа T также может быть использован для указания типа возвращаемого значения метода:

T getob() {

return ob;

}

Как использовать обобщённый класс. Можно создать версию класса Gen для целых чисел:

Gen<Integer> iOb;

В угловых скобках указан тип Integer, т.е. это аргумент типа, который передаётся в параметре типа T класса Gen. Фактически мы создаём версию класса Gen, в которой все ссылки на тип T становятся ссылками на тип Integer.

Когда мы присваиваем ссылку на экземпляр, то угловые скобки также требуется указывать.

iOb = new Gen<Integer>(new Integer(88));

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]