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

ООП в Java. Обобщения. Ограниченные типы

Лекция 5

Вызов метода getSumm в обобщенном классе InClass

public static void main(String args[]) {

Integer t[] = { 3, 4, 5, 2, 1, 7, -3, -2, 19}; Float f[] = { 3.09F, 4.67F, 5.89F};

//Простые типы: int, float и т.д. //в обобщениях использовать нельзя

InClass <Integer> getI = new InClass(t);

System.out.println(getI.getSumm());

//Вернет 36.0

InClass <Float> getF = new InClass(f);

System.out.println(getF.getSumm()); //Вернет 13.649999856948853

}

ООП в Java. Обобщения. Шаблон аргумента.

Лекция 5

Поскольку методы могут принимать в качестве аргументов объекты классов, возникает вопрос — «Что делать, если в метод передается объект обобщенного класса?». Для этого применяется конструкция «шаблон аргумента».

//Метод возвращает максимальный элемент из двух массивов

//аргументом метода является объект обобщенного класса public Double getMax(InClass<?> ic) {

Double s = Mass[0].doubleValue();

Number[] temp = ic.getMass();

for(int i=1; i<Mass.length; i++) { if( s < Mass[i].doubleValue() ) {

s = Mass[i].doubleValue();

}

}

for(int j=0; j<temp.length; j++) { if( s < temp[j].doubleValue() ) {

s = temp[j].doubleValue();

}

}

return s;

}

ООП в Java. Обобщения. Шаблон аргумента.

Лекция 5

Выполнение программы с шаблоном аргумента.

public static void main(String args[]) {

Integer t[] = { 3, 4000, 5, 2, 1, 7, -3, -2, 19};

Float f[] = { 300.09F, 4.67F, 25.89F};

InClass <Integer> getI = new InClass(t); InClass <Float> getF = new InClass(f);

System.out.println(getI.getMax(getF)); //Вернет 4000 //В метод getMax передается объект getF обобщенного //класса InClass

}

ООП в Java. Обобщения. Ограниченный шаблон аргумента.

Лекция 5

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

//Метод будет работать только с объектом обобщенного Класса Number и его подклассами

public Double getMax(InClass<? Extends Number> ic) {

...

}

Можно использовать для ограничения и пользовательские классы

class A{}

class B extends A{} class D{}

class C<T> { T obj;

C(T obj) { this.obj = obj; }

public void test(C<? extends A> obj) { ... }

}

A a = new A(); B b = new B(); D d = new D();

C<A> c1 = new C<A>(a); C<B> c2 = new C<B>(b); C<D> c3 = new C<D>(d); c1.test(c1); c1.test(c2); c2.test(c1); c2.test(c2);

//Будет ошибка

//c3.test(c3); c1.test(c3); c2.test(c3);

ООП в Java. Обобщения. Обобщенные методы

Лекция 5

Методы также могут иметь обобщенную форму. Обобщенные методы могут быть определены как в обобщенных, так и в обычных классах.

Объявление обобщенного метода имеет следующий порядок:

1.Сначала (после модификаторов) приводится описание обобщенного типа

2.Затем тип возвращаемый методом

3.Затем имя метода

4.Затем аргументы обобщенные и обычные

public class noGeneric {

//Метод возвращает сумму массива

static <T extends Number> Double massSumm(T[] mass) {

Double summ = 0D; for(T temp: mass) {

summ += temp.doubleValue();

}

return summ;

}

}

ООП в Java. Обобщения. Обобщенные методы

Лекция 5

Выполнение обобщенного метода

public static void main(String args[]) {

Integer t[] = { 300, 467, 25 };

Float f[] = { 300F, 467F, 25F };

//noGeneric gn = new noGeneric(); System.out.println(noGeneric.massSumm(t)); //Вернет 792.0 System.out.println(noGeneric.massSumm(f));

//Вернет 792.0

}

ООП в Java. Обобщения. Обобщенные методы

Лекция 5

Методы могут иметь несколько обобщенных аргументов

//Метод возвращает true, если сумма элементов массива T

//больше суммы элементов массива V static <T extends Number, V extends T>

boolean massMoreSumm(T[] mass_1, V[] mass_2) {

Double summ_1 = 0D;

Double summ_2 = 0D;

for(T temp: mass_1) {

summ_1 += temp.doubleValue();

}

for(T temp: mass_2) {

summ_2 += temp.doubleValue();

}

if( summ_1 > summ_2 ) return true; return false;

}

ООП в Java. Обобщения. Обобщенные методы

Лекция 5

Выполнение обобщенного метода с несколькими обобщенными аргументами

public static void main(String args[]) {

Integer t[] = { 301, 467, 25 };

Float f[] = { 300F, 467F, 25F };

//noGeneric gn = new noGeneric(); System.out.println(noGeneric.massMoreSumm(t, f)); //Вернет true

}

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

Лекция 5

Конструкторы также могут иметь обобщенную форму. Обобщенные конструкторы могут быть определены как в обобщенных, так и в обычных классах.

Объявление обобщенного конструктора имеет следующий порядок:

1.Сначала приводится описание обобщенного типа

2.Затем имя конструктора

3.Затем аргументы обобщенные и обычные

public class TSumm { private Double summ;

<T extends Float> TSumm(T[] mass) { System.out.println("Вещественное одинарной точности"); this.summ = this.checkSumm(mass);

}

<T extends Integer> TSumm(T[] mass) { System.out.println("Целое"); this.summ = this.checkSumm(mass);

}

private <T extends Number> Double checkSumm(T[] mass) { Double summ = 0D;

for(T temp: mass) {

summ += temp.doubleValue();

}

return summ;

}

public Double getSumm() { return this.summ;

}

}

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

Лекция 5

Использование обобщенного конструктора

public static void main(String args[]) {

Integer t[] = { 301, 467, 25 };

Float f[] = { 300F, 467F, 25F };

TSumm gn1 = new TSumm(t); //Целое

System.out.println(gn1.getSumm()); //Вернет 793.0

TSumm gn2 = new Tsumm(f);

//Вернет Вещественное одинарной точности System.out.println(gn2.getSumm()); //Вернет 792.0

}

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