Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
В данном случае типом первого аргумента является Integer, который и заменяет тип параметра Т. Таким же является и тип второго аргумента, а следовательно, тип параметра V также заменяется на Integer. Следовательно, выражение для вызова метода arraysEqual () составлено правильно, и оба массива можно сравнить друг с другом.
Обратите далее внимание на следующие закомментированные строки:
// if(arraysEqual(nums, dvals))
// System.out.println("nums equals dvals");
Если удалить в них символы комментариев и попытаться скомпилировать программу, то компилятор выдаст сообщение об ошибке. Дело в том, что верхней границей для типа параметра V является тип параметра Т. Этот тип указывается после ключевого ело- ва extends, т.е. тип параметра V может быть таким же, как и у параметра т, или быть его подклассом. В данном случае типом первого аргумента рассматриваемого здесь метода является Integer, заменяющий тип параметра т, тогда как типом второго аргумента — Double, не являющийся подклассом Integer. Таким образом, вызов метода arraysEqual () оказывается недопустимым, что и приводит к ошибке при компиляции.
Синтаксис объявления метода arraysEqual () может быть обобщен. Ниже приведена общая форма объявления обобщенного метода.
<параметрытипа> возвращаемыйтип имя_метода (параметры) { // ...
Как и при вызове обычного метода, параметры_типа разделяются запятыми. В обобщенном методе их список предваряет возвращаемый_тип.
## Обобщенные конструкторы
Конструктор может быть обобщенным, даже если сам класс не является таковым. Например, в приведенной ниже программе класс Summation не является обобщенным, но в нем используется обобщенный конструктор.
// Применение обобщенного конструктора,
class Summation {
private int sum;
// Обобщенный конструктор.
<T extends Number> Summation(T arg) {
sum = 0;
for(int i=0; i <= arg.intValue(); i++)
sum += i;
}
int getSum() {
return sum;
}
}
class GenConsDemo {
public static void main(String args[]) {
Summation ob = new Summation(4.0);
System.out.println("Summation of 4.0 is " +
ob.getSum());
}
}
В классе Summation вычисляется и инкапсулируется сумма всех чисел от 0 до N, причем значение N передается конструктору. Для конструктора Summation () указан параметр типа, ограниченный сверху классом Number, и поэтому объект типа Summation может быть создан с использованием любого числового типа, в том числе Integer, Float и Double. Независимо от используемого числового типа, соответствующее значение преобразуется в тип Integer при вызове intValue (), а затем вычисляется требуемая сумма. Таким образом, класс Summation совсем не обязательно объявлять обобщенным — достаточно сделать обобщенным только его конструктор.
## Обобщенные интерфейсы
Наряду с обобщенными классами и методами существуют также обобщенные интерфейсы. Такие интерфейсы определяются подобно обобщенным классам. Их применение демонстрируется в приведенном ниже примере программы. В ней создается интерфейс Containment, который может быть реализован классами, хранящими одно или несколько значений. Кроме того, в этой программе объявляется метод contains (), в котором определяется, содержится ли указанное значение в текущем объекте.
// Пример обобщенного интерфейса.
// В этом интерфейсе подразумевается, что реализующий
// его класс содержит одно или несколько значений,
interface Containment { // обобщенный интерфейс
// Метод contains() проверяет, содержится ли
// некоторый элемент в объекте класса,
// реализующего интерфейс Containment,
boolean contains(Т о);
}
// реализовать интерфейс Containment с помощью массива,
// предназначенного для хранения значений.