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


Начнем рассмотрение обобщенных методов с конкретного примера.



2019-07-03 211 Обсуждений (0)
Начнем рассмотрение обобщенных методов с конкретного примера. 0.00 из 5.00 0 оценок




// Продемонстрировать простой обобщенный метод

class Gen М ethDemo {

// Определить, содержится ли объект в массиве

static < T extends Comparable <T> , V extends T >

boolean isIn ( T x , V [ ] y ) {

for ( int i = 0 ; i < y.length; i++ )

  if ( x.equals( y[ i ] )) return true ;

return false ;

}

public static void main ( String args[ ] ) {

//применить метод isIn ( ) для целых чисел

Integer nums [ ] = { 1 , 2 , 3, 4 , 5 } ;

if ( isIn ( 2 , nums ) )

  System.out.println( "Чиcлo 2 содержится в массиве nums" ) ;

if ( ! isIn ( 7 , nums ) )

  System.out.println( "Чиcлo 7 отсутствует в массиве nums" ) ;

System . out . println ( ) ;

//применить метод isIn ( ) для символьных строк

String strs [ ] = { "один" , "два" , "три" ,"четыре" , "пять" } ;

if ( isIn ( "дв a " , strs ))

  System . out . println ( "дв a содержится в массиве strs " ) ;

if ( ! isIn ( " ce мь" , strs ) )

  System . out . println ( " ce мь отсутствует в массиве strs " ) ;

//Не скомпилируется! Типы должны быть совместимы

// if ( isIn ( "дв a " , nums ) )

// System . out . println ( "дв a содержится в массиве strs " ) ;

}

}

В приведенной ниже программе объявляется необобщенный класс GenMeth Demo , а в нем статический обобщенный метод is I n ( ) . Этот метод определяет, является ли объект чле ном массива. Его можно применять к любому типу объектов и массивов, при условии, что массив содержит объекты, совместимые с типом искомого объекта.

Параметр типа объявляется до типа, возвращаемого методом. Обратите так же внимание на то, что тип Т расширяет обобщенный тип Comparble < T >, где Compara ble - это интерфейс, объявляемый в пакете java.lang. В классе, реалиэующем интерфейс Comparable , определяются объекты, которые моrут быть упо рядочены. Следовательно, указание интерфейса Compara ble в качестве верхней границы гарантирует, что метод isln ( ) вполне применим к объектам, которые можно сравнивать. Интерфейс Comparable является обобщенным, а параметр его типa обозначает тип сравниваемых объектов. (Далее в этой главе будет показано, как создается обобщенный интерфейс. ) Обратите далее внимание на то, что тип V ограничен сверху типом Т. Это означает, что тип V должен быть тем же типом, что и Т, или же типом его подкласса. Такая взаимосвязь подразумевает, что метод isIn ( ) может быть вызван только с совместимыми аргументами. И, наконец, об ратите внимание на то, что метод is I n ( ) объявлен как статический, что позволяет вызывать его независимо ни от какого объекта. Следует, однако, иметь в виду, что обобщенные методы могут быть как статическими, так и нестатическими. Никаких ограничений на этот счет не существует.

А теперь обратите внимание на то, что метод is I n ( ) вызывается из метода

Main ( ) с нормальным синтаксисом вызовов, не требуя указывать аргументы типа.

Дело в том, что типы аргументов различаются автоматически, а типы Т и V cooт ветственно подстраиваются. Например, в первом вызове этого метода.

I f ( isIn ( 2 , nums ) )

Первый аргумент относится к типу Intger (благодаря автоупаковке) , поэто му вместо типа Т подставляется тип Integer . Второй аргумент также относится к типу Integer , который подставляется вместо типа V. Во втором вызове данного метода оба аргумента относятся к типу String , который и подставляется вместо типов Т и V.

Для вызовов большинства обобщенных методов, как правило, достаточно и вы ведения типов, но если требуется, то аргументы типа можно указать явно. В качестве примера ниже показано, как должен выглядеть первый вызов метода isIn ( ) , если явно указаны оба аргумента типа.

Gen М ethDemo . < Integer , Integer > isIn ( 2 , nums )

Очевидно, что явное указание аргументов типа в данном случае не дает никаких преимуществ. Более того, выведение типов в отношении методов было усовершенствовано в версии JDК 8. Таким образом, указывать аргументы типа явным образом требуется лишь в крайне редких случаях.

Ниже приведена общая синтаксическая форма обобщенного метода.

< список_ параметров_ типа > возвращаемый_тип

имя_метода (список_параметров) {//…

В любом случае список_ параметров_ типа обозначает разделяемый запятыми список параметров типа. Обратите внимание на то, что в объявлении обобщенного метода список параметров типа предшествует возвращаемому типу.

Обобщенные конструкторы

// Использовать обобщенный конструктор

class GenCons {

private double val ;

<T extends Number > GenCons ( T arg ) {

  val = arg.doubleValue ( ) ;

}

void showval ( ) {

System.out.println ( "val: " + val ) ;

}

}

class GenConsDemo {

public static void main ( String args[ ] ) {

GenCons test = new GenCons ( 100 ) ;

GenCons test2 = new GenCons ( 123.5F ) ;

test.showval ( ) ;

test2.showval ( ) ;

}

}

Обобщенные интерфейсы

Помимо классов и методов, обобщенными можно объявлять интерфейсы.

Обобщенные интерфейсы объявляются таким же образом, как и обобщенные классы. Ниже приведен характерный пример. В нем создается обобщенный интерфейс MinMax, где объявляются методы min ( ) и max ( ) , которые, как предполагается, должны возвращать минимальное и максимальное значения из некоторого множества объектов.

// Пример применения обобщенного интерфейса

// Обобщенный интерфейс МinМах для определения

// минимального и максимального значений

interface MinMax <T extends Comparable < T > >{

T min ( ) ;

T max ( ) ;

}

class MyClass <T extends Comparable < T > > implements MinMax <T> {

T [ ] vals ;

MyClass ( T [ ] о ) { vals = о ; }

//возвратить минимальное значение из массива vals

public T min ( ) {

  T v = vals [ 0 ] ;

  for ( int i = 1 ; i < vals.length; i++ )

    if ( vals [ i ].compareTo(v) < 0 ) v = vals [ i ] ;

    return v ;

}

//возвратить максимальное значение из массива vals

public T max ( ) {

  T v = vals [ 0 ] ;

  for ( int i = 1 ; i < vals.length ; i++ )

    if ( vals [ i ].compareTo(v) > 0 ) v = vals [ i ] ;

    return v ;

}

}

class GenIFDemo {

public static void main ( String args [ ] ) {

Integer inums [ ] = { 3 , 6 , 2 , 8 , 6 } ;

Character chs [ ] = { 'b' , 'r' , 'p' , 'w' } ;

MyClass < Integer > iob = new MyClass < Integer> ( inums ) ;

MyClass <Character> cob = new MyClass <Character > ( chs ) ;

System.out.println ( "Ma к c им a льн oe значение в массиве inums: " +

   iob.max ( )) ;

System.out.println( " Миним a льн oe значение в массиве inums: " +

   iob.min ( )) ;

System.out.println( "Ma к c им a льн oe значение в массиве chs : " +

   cob.max ( )) ;

System.out.println( " Миним a льн oe значение в массиве chs : " +

   cob.min ( )) ;

}

}

Иерархии обобщений и другие более глубокие вопросы этой темы в книге Шилдт Г. Java 8.Полное руководство.



2019-07-03 211 Обсуждений (0)
Начнем рассмотрение обобщенных методов с конкретного примера. 0.00 из 5.00 0 оценок









Обсуждение в статье: Начнем рассмотрение обобщенных методов с конкретного примера.

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

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

Популярное:
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...



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

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

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

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

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

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



(0.006 сек.)