Применение метасимвольных аргументов
Типовая безопасность удобна не только сама по себе, но иногда она позволяет получить идеально подходящие конструкции. Например, в классе Stats , рассмотренном в предыдущем разделе, предполагается, что в него требуется ввести метод sameAvg ( } , который определяет, содержат ли два объекта типа St a ts массивы, дающие одинаковое среднее значение независимо от типа числовых значений в них. Так, если один такой объект содержит значения 1. 0, 2. 0 и 3.0 типа dou ble , а другой - целочисленные значения 2 , 1 и З , то их среднее значение будет одинаковым. Для того чтобы реализовать метод sameAvg ( } , можно, в частности , передать ему аргумент типа Stats , а затем сравнить средние значения в этом методе и вызывающем объекте, возвращая логическое значение true , если они равны. Кроме того, необходимо иметь возможность вызывать метод sameAvg ( ). // Применение метасимвола class Stats < T extends Number >{ T [ ] nums ; // массив класса Number или его подкласса // передать конструктору ссылку на массив // элементов класса Number или его подкласса Stats ( T [ ] o ) {nums = o ;} // возвратить значение типа double в любом случае double average ( ) { double sum = 0.0 ; for ( int i = 0; i < nums.length; i++ ) sum += nums[ i ].doubleValue ( ); return sum / nums.length ; } // Определить равенство двух средних значений. // Обратите внимание на применение метасиывола boolean sameAvg ( Stats < ? > ob ) { if ( average ( ) == ob.average ( ) ) return true ; return false ; } } // Продемонстрировать применение метасимвола class WildcardDemo { public static void main ( String args [ ] ) { Integer inums [ ] = { 1 , 2 , 3 , 4 , 5 } ; Stats < Integer > iob = new Stats < Integer > ( inums ) ; double v = iob.average ( ) ; System.out.println ( "Cpeднee значение iob равно " + v ) ; Double dnums [ ] = { 1.1, 2.2, 3.3, 4.4, 5.5 } ; Stats < Double > dob = new Stats <Double > ( dnums ) ; double w = dob.average ( ) ; System.out.println ( "Cpeднee значение dob равно " + w ) ;
Float fnums [ ] = { 1.0F, 2.0F, 3.0F, 4.0F, 5.0F } ; Stats < Float > fob = new Stats < Float > ( fnums ) ; double x = fob.average ( ) ; System.out.println ( "Cpeднee значение fob равно " + x ) ; // Выяснить, какие массивы имеют одинаковые средние значения System . out . print ( " Cpe дни e значения iob и dob " ) ; if ( iob.sameAvg ( dob ) ) System.out.println ( " paвны." ) ; else System.out.println ( " oтличaютcя." ) ; System.out.print ( "Cpeдниe iob и fob" ) ; if ( iob.sameAvg ( fob ) ) System.out.println ( " oдинaкoвы." ) ; else System.out.println ( " oтличaютcя." ) ; } } Ограниченные метасимвольные аргументы Метасимвольные аргументы могут быть ограничены почти таким же образом, как и параметры типов. Ограничивать метасимвольный аргумент особенно важно при создании обобщенного типа, оперирующего иерархией классов. // Ограниченные метасимвольные аргументы // Двумерные координаты class TwoD { int x, y ; TwoD ( int а , int b ) {x = а ; y = b ;} } // Трехмерные координаты class ThreeD extends TwoD { int z ; ThreeD ( int а , int b , int с ) { super ( а , b ) ; z = с ; } } // Четырехмерные координаты class FourD extends ThreeD { int t ; FourD ( int a , int b , int с , int d ) { super ( a , b , с ) ; t = d ; } } // Этот класс хранит массив координатных объектов class Coords < T extends TwoD> { // ограничили сверху T [ ] coords ; Coords ( T [ ] o ) { coords = o; } } // Продемонстрировать применение ограниченных метасимволов class BoundedWildcard { // Перевод – ограниченный шаблон static void showXY ( Coords < ? > c ) { System.out.println ( "Koop дин a ты Х У : " ) ; for ( int i = 0 ; i < c.coords.length ; i++ ) System.out.println ( c.coords [ i ].x + " " + c.coords [ i ].y ) ; System.out.println ( ) ; } static void showXYZ ( Coords < ? extends ThreeD> c ) { System.out.println ( " Koop дин a ты Х У Z : " ) ; for ( int i = 0 ; i < c.coords.length ; i++ ) System.out.println( c.coords [ i ].x + " " + c.coords [ i ].y + " " + c.coords [ i ].z ) ; System.out.println( ) ; } static void showAll ( Coords < ? extends FourD > c ){ System.out.println ( " Koop дин a ты Х У Z Т : " ) ; for ( int i = 0 ; i < c.coords.length ; i++ ) System.out.println( c.coords [ i ].x + " " + c.coords [ i ].y + " " + c.coords [ i ].z + " " + c.coords [ i ].t ) ; System.out.println( ) ; } public static void main ( String args [ ] ) { TwoD td [ ] = { new TwoD ( 0 , 0 ) , new TwoD ( 7 , 9 ) , new TwoD ( 18 , 4 ) , new TwoD ( -1 , -23 ) }; Coords <TwoD> tdlocs = new Coords <TwoD> ( td ) ; System.out.println ( "Co д ep жим oe объекта tdlocs." ) ; showXY ( tdlocs ) ; // Верно , это тип Т woD // showXYZ ( tdlocs ) ; // Ошибка , это не тип ТhreeD // showAll ( tdlocs ) ; // Ошибка , это не тип FourD // а теперь создать несколько объектов типа FourD FourD fd [ ] = { new FourD ( 1 , 2 , 3 , 4 ) , new FourD ( 5 , 8 , 14 , 8 ) , new FourD ( 22 , 9 , 4 , 9 ) , new FourD ( 3 , -2 , -23 , 17 ) } ; Coords <FourD> fdlocs = new Coords < FourD> ( fd ) ; System.out.println( "Co д ep жим oe объекта fdlocs." ) ; //Здесь все верно showXY ( fdlocs ) ; showXYZ ( fdlocs ) ; showAll ( fdlocs ) ; } } В общем, чтобы установить верхнюю границу для метасимвола, следует вос пользоваться приведенной ниже формой метасимвольного выражения: <? extends суперкласс> Здесь суперкласс обозначает имя класса, который служит верхней границей. Не следует забывать, что это включающее выражение, а следовательно, класс, за данный в качестве верхней границы (т.е. суперкласс) , также находится в пределах допустимых типов. Имеется также возможность указать нижнюю границу для метасимвольного аргумента, введя оператор super в его объявление. Ниже приведена общая форма наложения ограничения на метасимвольный аргумент снизу. <? super nодкласс> В данном случае допустимыми аргументами могут быть только те классы, которые являются суперклассами для указанного подкласса . Это исключающее выражение, поскольку оно не включает в себя заданный подкласс. Создание обобщенного метода В методах обобщенного класса можно использовать параметр типа, а следовательно, они становятся обобщенными относительно параметра типа. Но можно объявить обобщенный метод, в кото ром непосредственно используется один или несколько параметров типа. Более того, можно объявить обобщенный метод, входящий в необобщенный класс.
Популярное: Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (273)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |