if(iOb.absEqual(10b)) В первом вызове переменная iOb указывает на объект типа NumericFns, а переменная dOb — на объект типа NumericFns. Благодаря применению ме- тасимвольного аргумента по ссылке на объект iOb удается передать объект dOb методу absEqual . Подобным образом формируется и другой вызов, в котором методу передается объект типа NumericFns. И последнее замечание: не следует забывать, что метасимвольные аргументы не оказывают влияния на тип создаваемого объекта в классе NumericFns. Для этой цели служит оператор extends, указываемый в объявлении класса NumericFns. Метасимвольный аргумент лишь указывает на соответствие любому допустимому объекту класса NumericFns. ## Ограниченные метасимвольные аргументы Метасимвольные аргументы можно ограничивать таким же образом, как и любой параметр типа. Ограниченные метасимвольные аргументы приобретают особое значение при написании методов, которые должны оперировать только объектами подклассов отдельного суперкласса. Для того чтобы стало понятнее назначение метасимвольных аргументов, обратимся к простому примеру. Допустим, имеется следующий ряд классов:

class А { // ... }

class В extends А { // ... }

class С extends А { // ... }

// Обратите внимание на то, что D не является подклассом А. class D { // ... } Здесь класс А является суперклассом для классов В и С, но не для класса D. Теперь рассмотрим очень простой обобщенный класс.

// Простой обобщенный класс. class Gen { ^ Т ob; Gen(Т о) { ob = о; }

} В классе Gen предусмотрен один параметр типа, который определяет тип объекта, хранящегося в переменной ob. Как видите, на тип Т не накладывается никаких ограничения. Следовательно, параметр типа Т может обозначать любой класс. А теперь допустим, что требуется создать метод, принимающий аргумент любого типа, соответствующего объекту класса Gen, при условии, что в качестве параметра типа этого объекта указывается класс А или его подклассы. Иными словами, требуется создать метод, который оперирует только объектами типа Gen<тип>, где тип — это класс А или его подклассы. Для этой цели нужно воспользоваться ограниченным метасимволь- ным аргументом. Ниже для примера приведено объявление метода test , которому в качестве аргумента может быть передан только объект класса Gen, на параметр типа которого накладываются следующие ограничения: соответствие классу А или его подклассам.

// Здесь знак ? устанавливает соответствие // классу А или производным от него подклассам, static void test(Gen o) { // ... } А приведенный ниже пример класса демонстрирует типы объектов класса Gen, которые могут быть переданы методу test .

class UseBoundedWildcard { // Здесь знак ? устанавливает соответствие // классу А или производным от него подклассам. //В объявлении этого метода используется ограниченный // метасимвольный аргумент. static void test(Gen о) { // ... } public static void main(String args[]) { A a = new A; В b = new В ; С с = new C; D d = new D ; Gen w = new Gen(a); Gen w2 = new Gen(b); Gen w3 = new Gen(c); Gen w4 = new Gen(d); // Эти вызовы метода test допустимы, так как // объекты w, w2 и w3 относятся к подклассам А. test(w); test(w2); test(w3); //А этот вызов метода test недопустим, так как // объект не относится к подклассу Л. // test(w4); // Ошибка! }

Перейти на страницу:

Похожие книги