Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
// передать конструктору ссылку на числовой объект
NumericFns(Т п) {
num = п;
}
// возвратить обратную величину
double reciprocal() {
return 1 / num.doubleValue();
}
// возвратить дробную часть
double fraction() {
return num.doubleValue() - num.intValue();
}
// определить равенство абсолютных значений в двух объектах
boolean absEqual(NumericFns<?> ob) {
if(Math.abs(num.doubleValue()) ==
Math.abs(ob.num.doubleValue())) return true;
return false;
}
// ...
}
// продемонстрировать применение метасимвольного аргумента
class WildcardDemo {
public static void main(String args[]) {
NumericFns iOb =
new NumericFns(6) ;
NumericFns dOb =
new NumericFns(-6.0) ;
NumericFns 10b =
new NumericFns(5L);
System.out.println("Testing iOb and dOb.");
// В этом вызове метода тип метасимвольного
// аргумента совпадает с типом Double.
if(iOb.absEqual(dOb))
System.out.println("Absolute values are equal.");
else
System.out.println("Absolute values differ.");
System.out.println();
System.out.println("Testing iOb and 10b.");
// А в этом вызове метода тип метасимвольного
// аргумента совпадает с типом Long.
if(iOb.absEqual(10b))
System.out.println("Absolute values are equal.");
else
System.out.println("Absolute values differ.");
}
}
Выполнение этой программы дает следующий результат:
Testing iOb and dOb.
Absolute values are equal.
Testing iOb and 10b.
Absolute values differ.
Обратите внимание на два следующих вызова метода absEqual ():
if(iOb.absEqual(dOb))
if(iOb.absEqual(10b))
В первом вызове переменная iOb указывает на объект типа NumericFns<Integer>, а переменная dOb — на объект типа NumericFns<Double>. Благодаря применению ме- тасимвольного аргумента по ссылке на объект iOb удается передать объект dOb методу absEqual (). Подобным образом формируется и другой вызов, в котором методу передается объект типа NumericFns<Long>.
И последнее замечание: не следует забывать, что метасимвольные аргументы не оказывают влияния на тип создаваемого объекта в классе NumericFns. Для этой цели служит оператор extends, указываемый в объявлении класса NumericFns. Метасимвольный аргумент лишь указывает на соответствие любому допустимому объекту класса NumericFns.
## Ограниченные метасимвольные аргументы
Метасимвольные аргументы можно ограничивать таким же образом, как и любой параметр типа. Ограниченные метасимвольные аргументы приобретают особое значение при написании методов, которые должны оперировать только объектами подклассов отдельного суперкласса. Для того чтобы стало понятнее назначение метасимвольных аргументов, обратимся к простому примеру. Допустим, имеется следующий ряд классов:
class А {
// ...
}
class В extends А {
// ...
}
class С extends А {
// ...
}
// Обратите внимание на то, что D не является подклассом А.
class D {
// ...
}
Здесь класс А является суперклассом для классов В и С, но не для класса D.
Теперь рассмотрим очень простой обобщенный класс.
// Простой обобщенный класс.
class Gen { ^
Т ob;
Gen(Т о) {
ob = о;
}
}
В классе Gen предусмотрен один параметр типа, который определяет тип объекта, хранящегося в переменной ob. Как видите, на тип Т не накладывается никаких ограничения. Следовательно, параметр типа Т может обозначать любой класс.