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

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

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

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

//    
//   MinMax  
//    

interface MinMax<T extends Comparable<T>> {
    T min();
    T max();
}

//    MinMax

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

    T[] vals;

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

    //      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, 16, 2, 48, 6, 10, 33, 4 };
    Character chs[] = { 'c', 'b', 'r', 'p', 'w', 'Z' };

    MyClass<Integer> iob = new MyClass<Integer>(inums);
    MyClass<Character> cob = new MyClass<Character>(chs);

    System.out.println("    inums: " + iob.max());
    System.out.println("    inums: " + iob.min());
    System.out.println("    chs: " + cob.max());
    System.out.println("    chs: " + cob.min());

    }
}

Ниже приведен результат выполнения данной программы.

pro-java.ru@admin:~$ javac genericinterface.java 
pro-java.ru@admin:~$ java GenIFDemo 
    inums: 48
    inums: 2
    chs: w
    chs: Z
pro-java.ru@admin:~$

Большую часть этой программы нетрудно понять, но некоторые ключевые моменты следует все же пояснить.

Прежде всего обратите внимание на следующее объявление обобщенного интерфейса MinMax:

interface MinMax<T extends Comparable<T>> {

Как правило, обобщенный интерфейс объявляется таким же образом, как и обобщенный класс. В данном случае параметр типа T ограничивается сверху интерфейсом Comparable.

Интерфейс Comparable определен в пакете java.lang для целей сравнения объектов. Параметр его типа обозначает тип сравниваемых объектов.

Затем интерфейс MinMax реализуется в классе MyClass. Объявление класса МyClass выглядит следующим образом:

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

Обратите особое внимание, каким образом параметр типа T сначала объявляет­ся в классе MyClass, а затем передается интерфейсу MinMax.

Интерфейсу MinMax требуется тип класса, реализующего интерфейс Comparable, поэтому в объявле­нии класса, реализующего этот интерфейс (в данном случае - класса MyClass ), должно быть наложено такое же ограничение.

Более того, однажды наложенное ограничение уже не нужно повторять в операторе implements. В действительности это было бы даже неверно.

Например, приведенная ниже строка неверна и не может быть скомпилирована. Однажды установленный параметр типа просто передается интерфейсу без последующих видоизменений.

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

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

Например, следующая попытка объявить класс MyClass приведет к ошибке:

class MyClass implements MinMax<T> { // !

В классе MyClass параметр типа не объявляется, поэтому передать его интер­фейсу MinMax никак нельзя.

В данном случае идентификатор параметра типа Т просто неизвестен, и поэтому компилятор выдаст ошибку.

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

class MyClass implements MinMax<Integer> { // 

Обобщенный интерфейс дает два преимущества. Во-первых, он может быть реализован для разных типов данных.

И во-вторых, он позволяет наложить огра­реничения на типы данных, для которых он может быть реализован. В примере ин­терфейса MinMax вместо параметра типа Т могут быть подставлены только типы классов, реализующих интерфейс Comparable.

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

interface _<__> { // ...

Здесь список_параметров_типа обозначает разделяемый запятыми список па­раметров типа.

Когда реализуется обобщенный интерфейс, следует указать аргу­рменты типа, как показано ниже.

class _<__>
    implements _<__> {

Советуем вам следующее видео к просмотру:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *