реализация общего интерфейса, который расширяется от сопоставимых - PullRequest
0 голосов
/ 22 сентября 2018
public interface MyArray  <T extends Comparable <T>> {

T get( int i);
void set ( int i, T e);
int min ();
int max (); 
int nbBetween (T e1 , T e2);
}

public class MyArrayFactory {
    public static <T extends Comparable <T>> MyArray <T> getMyArray( int n) {
        MyArray<T> ar;
        ar = new ArrayImplentation(n);
        return ar;
    }}

Я хочу реализовать универсальный класс массива, имеющий следующий интерфейс

, класс MyArrayFactory, который просто создает и возвращает объект моей реализации интерфейса MyArray.

, и этомой класс реализации:

     public class ArrayImplentation<T extends Comparable <T>> implements MyArray<T>{


    public MyArray[]arr;

    public ArrayImplentation(int n) {
        arr= (MyArray[])new Object[n];
    }

// Return the element at position i
        public T get( int i) {
        T t = (T)arr[i];
        return t;
        }
        // Set the element at position i
        public void set ( int i, T e) {
            arr[i]=(MyArray)e;
        }
        // Return the index of smallest element in the array ( index of first occurrence returned )
        public int min () {
             T minValue = (T)arr[0];
             for(int i = 1; i < arr.length; i++) {
                 if(minValue.compareTo((T)arr[i])>0) {  
                 return i;
             }}
                 return 0;}
        // Return the index of largest element in the array ( index of first occurrence returned )
        public int max () {

             T maxValue = (T)arr[0];
             for(int i = 1; i < arr.length; i++) {
                 if(maxValue.compareTo((T)arr[i])<0) {
                     return i;
        }}
                 return 0;}
        // Return the number of elements largest or equal e1 and smallest or equal e2
        public int nbBetween (T e1 , T e2) {
            int index=0;
            int index2=0;
            int count=0; 

            for(int i = 0; i < arr.length; i++) 
             if(e1.compareTo((T)arr[i])==0)
             index=i;

            for(int i = 0; i < arr.length; i++) 
             if(e2.compareTo((T)arr[i])==0) 
                 index2=i;

            for(int i=index;i<index2;i++)
                count++;

            return count;



        }

    }

так, что я должен сделать с классом реализации, чтобы решить проблему работы с универсальными типами?приведение классов и многое другое, и есть ли конкретный способ иметь специальный метод compareTo?

1 Ответ

0 голосов
/ 22 сентября 2018

Если мы посмотрим, как это делает TreeMap, это может дать нам представление о том, как мы можем это реализовать:

По своей природе (будучи двоичным деревом), TreeMap необходимо сравнить ключи, так что они правильно помещаются в двоичное дерево, но класс TreeMap требует ключ универсального типа, который не должен реализовывать Compareable.Это объявление:

public class TreeMap<K,V> extends ...

Конструктор TreeMap не может иметь аргументов или аргумент Comparator:

public TreeMap() {
    comparator = null;
}

public TreeMap(Comparator<? super K> comparator) {
    this.comparator = comparator;
}

И у него есть функция compare, которую он используетвнутренне:

final int compare(Object k1, Object k2) {
    return comparator == null ? ((Comparable<? super K>)k1).compareTo((K)k2)
        : comparator.compare((K)k1, (K)k2);
}

Эта функция compare объясняет, как она работает: сначала она пытается использовать предоставленный объект comparator для сравнения двух объектов.Если он недоступен, он предполагает, что объекты сравнимы, и пытается сравнить их, используя их реализацию Comparable, приводя их к экземплярам Comparable.Если они на самом деле не реализуют Comparable, выдается ClassCastException, и в этом случае TreeMap работает неправильно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...