Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Заочники 2020-2021 / Лекция 5.ppt
Скачиваний:
81
Добавлен:
15.06.2021
Размер:
660.99 Кб
Скачать

ООП в Java. Некоторые примеры использования обобщений

Лекция 5

Использование в коллекциях

Например: ArrayList<MyObject>

Использование в генераторах объектов для заполнения коллекций

Пусть, например, для модели некоторого автопарка, на базе абстрактного класса Genearator созданы: генератор автомобилей — AutoGenerator

генератор водителей — DriverGenerator

import ... //Импортируем нужные классы автопарка

public class AutoPark {

fill(Collection<T> coll, Generator<T> gen, int n) { for(int i = 0; i < n; i++) {

coll.add(gen.make());

}

return coll;

}

public static void main(String args[]) {

//Создадим и заполним коллекции автомобилей и водителей

Coollection<Auto> Autos = fill(new ArrayList<Auto>(), new AutoGenerator<Auto>(), 20); Coollection<Driver> Drivers = fill(new ArrayList<Driver>(), new DriverGenerator<Driver>(), 20);

}

}

ООП в Java. Обобщения. Обобщенные интерфейсы

Лекция 5

Интерфейсы также могут иметь обобщенную форму. Объявление обобщенного интерфейса аналогично объявлению обобщенного класса. Классы реализующие обобщенный интерфейс должны быть также обобщенными.

public interface Containment<T> { boolean contains(T value);

}

...

public class noGeneric<T> implements main.Containment<T> {

T[] arrValue;

noGeneric(T[] value) { arrValue = value;

}

//Если в массиве arrValue содержится эквивалент value //возвращаем true

public boolean contains(T value) { for(T temp: arrValue) {

if(temp.equals(value)) return true;

}

return false;

}

}

ООП в Java. Обобщения. Обобщенные интерфейсы

Лекция 5

Результаты работы проверки наличия элемента в массиве с помощью обобщенного класса, расширяющего обобщенный интерфейс.

public static void main(String args[]) {

Integer t[] = { 301, 467, 25 }; Float f[] = { 300F, 467F, 25F }; Float check = 467F;

noGeneric gn1 = new noGeneric(t);

System.out.println(gn1.contains(check));

//Вернет false

noGeneric gn2 = new noGeneric(f); System.out.println(gn2.contains(check));

//Вернет true

}

ООП в Java. Автоматическое определение аргументов типа

Лекция 5

В JDK 7 доступна упрощенная форма записи создания экземпляра класса.

Вместо

Test <Integer, String> TestItem = new Test<Integer, String>(100, "Java");

Можно записать

Test <Integer, String> TestItem = new Test<>(100, "Java");

Такая же форма доступна и для аргументов обобщенных методов. Пусть определен метод:

boolean isTest(Test<T,V> obj) {

...

}

Тогда его можно вызвать так:

isObj.isTest(new Test<>(100, "Java"));

ООП в Java. Обобщения. Очистка

Лекция 5

Обобщения появились с версии JDK5. Поэтому для обеспечения совместимости кода, написанного до JDK5 и после, был выбран механизм, получивший название «очистка».

1.При компиляции в байт-код, все сведения об обобщенных типах удаляются и заменяются верхними границами типов, а параметры без указания заменяются на Object

2.Затем выполняется приведение типов, заданных аргументами типа

Ошибка неоднозначности

class Test<T, V> { T obj1;

V obj2;

...

void set(T obj) { obj1 = obj;

}

void set(V obj) { obj2 = obj;

}

}

Поскольку при очистке T и V должны быть заменены на Object, а Object может быть любым объектом, получается, Что возможен случай, когда методы имеют одинаковые Имена и сигнатуры

ООП в Java. Ограничения в использовании обобщений

Лекция 5

1. Ограничения статических членов класса

class Test<T> {

//Неверно т.к. нельзя объявить стат. переменную типа T static T obj;

//Неверно т.к. нельзя исп. стат. переменную типа T static T getObj() {

return obj

}

}

2. Ограничение создания экземпляров типа параметров типа

class Test<T> { T obj;

Test() {

obj = new T(); //Ошибка компиляции

}

}

3. Обобщенный класс не может расширять класс Throwable

ООП в Java. Ограничения в использовании обобщений

Лекция 5

4. Ограничения обобщенных массивов

4.1Нельзя получить экземпляр массива, тип элементов которого определяется параметром типа

public class InClass<T extends Number> { private T Mass[];

InClass(T t[]) {

//Mass = new T[10]; //Не допустимо т.к. тип T неизвестен this.Mass = t; //Допустимо присвоение ссылки

}

}

4.2 Нельзя создать массив обобщенных ссылок на объекты конкретного типа

TestObj<Integer> Test[] = new TestOgj<Integer>[10]; //Недопустимо

TestObj<?> Test[] = new TestOgj<?>[10]; //Допустимо

GUI в Java

Лекция 5

GUI — Graphics User Interface.

Графический пользовательский интерфейс (ГПИ).

GUI создается с помощью графических библиотек. Исторически их в Java три:

1.AWT

2.SWING (c 1998 г.)

3.JavaFX (c 2011 г.)

GUI в Java. AWT

Лекция 5

AWT использует для рисования контролы операционной системы (ОС).

Контрол это графический элемент GUI имеющий представление (графический вид) и управление (может генерить и слушать события)

Преимущества использования контролов ОС

1. Не надо «самим рисовать»

Недостатки использования контролов ОС

1.Отличающийся в разных ОС вид приложения

2.Малый список общих контролов. Т.е. контролов, которые есть на всех ОС.

GUI в Java. SWING

Лекция 5

SWING базируется на ряде объектов AWT, но имеет набор собственных контролов, которые одинаково показываются в разных ОС и всегда есть т. к. это контролы JRE

Ниже показана общность и разность AWT и SWING

Соседние файлы в папке Заочники 2020-2021