Мегаобучалка Главная | О нас | Обратная связь


Применение метасимвольных аргументов



2019-07-03 273 Обсуждений (0)
Применение метасимвольных аргументов 0.00 из 5.00 0 оценок




Типовая безопасность удобна не только сама по себе, но иногда она позволяет получить идеально подходящие конструкции. Например, в классе 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одкласс>

В данном случае допустимыми аргументами могут быть только те классы, которые являются суперклассами для указанного подкласса . Это исключающее выражение, поскольку оно не включает в себя заданный подкласс.

Создание обобщенного метода

В методах обобщенного класса можно использовать параметр типа, а следовательно, они становятся обобщенными относительно параметра типа. Но можно объявить обобщенный метод, в кото ром непосредственно используется один или несколько параметров типа. Более того, можно объявить обобщенный метод, входящий в необобщенный класс.



2019-07-03 273 Обсуждений (0)
Применение метасимвольных аргументов 0.00 из 5.00 0 оценок









Обсуждение в статье: Применение метасимвольных аргументов

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (273)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)