Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
Как было показано в предыдущих примерах, методы в обобщенных классах могут быть объявлены с параметром типа своего класса, а следовательно, такие методы автоматически становятся обобщенными относительно параметра типа. Но можно также объявить обобщенный метод с одним или несколькими параметрами его собственного типа. Более того, такой метод может быть объявлен в обычном, а не обобщенном классе.
Ниже приведен пример программы, в которой объявляется класс GenericMethodDemo, не являющийся обобщенным. В этом классе объявляется статический обобщенный метод arraysEqualO, в котором определяется, содержатся ли в двух массивах одинаковые элементы, расположенные в том ж самом порядке. Такой метод можно использовать для сравнения двух массивов одинаковых или совместимых между собой типов.
// Пример простого обобщенного метода,
class GenericMethodDemo {
// Этот обобщенный метод определяет,
// совпадает ли содержимое двух массивов.
static <Т, V extends Т> boolean arraysEqual(Т[] х, V[] у) {
// Если массивы имеют разную длину, они не могут быть одинаковыми,
if(х.length != у.length) return false;
for(int i=0; i < x.length; i++)
if(!x[i].equals(y[i]))
return false; // Массивы отличаются.
return true; // Содержимое массивов совпадает.
}
public static void main(String args[]) {
Integer nums[] = { 1, 2, 3, 4, 5 };
Integer nums2[] = {1, 2, 3, 4, 5 };
Integer nums3[] = {1, 2, 7, 4, 5 };
Integer nums4[] = {1, 2, 7, 4, 5, 6};
// Аргументы типа T и V неявно определяются при вызове метода.
if(arraysEqual(nums, nums))
System.out.println("nums equals nums");
if(arraysEqual(nums, nums2))
System.out.println("nums equals nums2");
if(arraysEqual(nums, nums3))
System.out.println("nums equals nums3");
if(arraysEqual(nums, nums4))
System.out.println("nums equals nums4");
// создать массив объектов типа Double
Double dvals[] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
// Следующая строка не будет скомпилирована, так как
// типы массивов nums и dvals не совпадают.
// if(arraysEqual(nums, dvals))
// System.out.println("nums equals dvals");
}
}
Результат выполнения данной программы выглядит следующим образом:
nums equals nums
nums equals nums2
Рассмотрим подробнее исходный код метода arraysEqual (). Посмотрите прежде всего, как он объявляется:
static <Т, V extends Т> boolean arraysEqual(Т[] х, V[] у) {
Параметры типа указываются перед возвращаемым типом. Обратите далее внимание на то, что верхней границей для типа параметра V является тип параметра Т. Таким образом, тип параметра V должен быть таким же, как и у параметра Т, или же быть его подклассом. Такая связь гарантирует, что при вызове метода arraysEqual () могут быть указаны только совместимые друг с другом параметры. И наконец, обратите внимание на то обстоятельство, что метод arraysEqual () объявлен как static, т.е. его можно вызывать независимо от любого объекта. Но обобщенные методы не обязательно должны быть статическими. В этом смысле на них не накладывается никаких ограничений.
А теперь проанализируем, каким образом метод arraysEqual () вызывается в методе main (). Для этого используется обычный синтаксис, а параметры типа не указываются. И это становится возможным потому, что типы аргументов данного метода распознаются автоматически, а типы параметров Т и V настраиваются соответствующим образом. Рассмотрим в качестве примера первый вызов метода arraysEqual ():
if(arraysEqual(nums, nums))