Page 109 - 6253
P. 109
Запустивши програму на виконання, отримаємо такий результат:
Середнє значення iOb: 3.0
Середнє значення dOb: 3.3
Оскільки тип Т обмежений класом Number, то компілятор мови Java знає, що з
будь-якого об’єкту типу Т може бути викликаний метод doubleValue(), оскільки
цей метод визначений у класі Number. Також, обмеження параметра Т запобігає
створенню нечислових об'єктів класу Generic. Наприклад, якщо забрати коментарі
в кінці програми, то виникне помилка часу виконання, оскільки клас String не є
підкласом Number.
Також в ролі обмеження можна використовувати тип інтерфейсу. Більше того,
таке обмеження може включати як тип класу, так і один або декілька типів
інтерфейсу. Коли обмеження включає тип інтерфейсу, то допустимими є тільки
аргументи типу, що реалізують цей інтерфейс. Якщо обмеження включає декілька
інтерфейсів, то для їх об’єднання використовується оператор «&». Синтаксис такої
конструкції наступний.
class І’мя_Класу<T extends Суперклас & Інтерфейс_1 & Інтерфейс_2 &
. . . & Інтерфейс_N> {
// тіло_класу
}
Параметр T обмежений класом Суперклас та інтерфейсами Інтерфейс_1,
Інтерфейс_2, ..., Інтерфейс_N. Тобто, будь-який тип, що передається через
параметр Т, має бути підкласом класу Суперклас і реалізовувати інтерфейси
Інтерфейс_1, Інтерфейс_2, ..., Інтерфейс_N.
Шаблони аргументів
Розширимо попередній приклад, додавши до класу Generic метод, який би
визначав, чи мітять два об’єкти класу Generic масиви, середні значення елементів
яких будуть рівними між собою не залежно від того, який тип даних в них
знаходиться. Для цього створимо метод sameAvg(), який буде повертати значення
108