Общий компаратор Java

public class arr<T>
{
    class comp <T extends Comparable<T>> implements Comparator<T>
    {
        public int compare(T lObj,T rObj)
        {
              return lObj.compareTo(rObj);
        }
    }

    ArrayList<T> list;
    Comparator<T> comparator;
    public arr()
    {
        list = new ArrayList<T>();
        comparator = new comp();
    }
    public void add(T data)
    {
        list.add(data);         
    }
    public int getLength()
    {
        return list.size();
    }
    public T get(int index)
    {
        return list.get(index);
    }
    public void sort()
    {
        list.sort(comparator);
    }
}

Здравствуйте, я пытаюсь заставить функцию сортировки работать, но у меня проблема. В конструкторе обр, если я напишу

comparator = new comp<T>();

это дает мне ошибку, говоря

"type argument T#1 is not within bounds of type-variable T#2 comparator = 
new comp<T>();                            ^
where T#1,T#2 are type-variables:
T#1 extends Object declared in class arr
T#2 extends Comparable<T#2> declared in class arr.comp"

А если я вытащу тип и напишу вот так

comparator = new comp;

тогда он работает, но дает мне предупреждение, в котором говорится

warning: [rawtypes] found raw type: arr.comp
comparator = new comp();

Я могу понять, что это значит по необработанным типам. Я не указываю тип, но каким-то образом он работает, и если я попытаюсь исправить предупреждение, указав тип, то оно выдаст ошибку. Не могли бы вы помочь мне разобраться? Я знаю ... Я новичок, мой код, должно быть, боль в твоих глазах. Я играю с универсальными компараторами и пытаюсь познакомиться со многими вещами. Спасибо.

Где вы используете new comp<T>? Этот тип T не будет существовать здесь вне ваших классов, и если он существует, то в противном случае он должен быть Сопоставимым типом. Кроме того, new comp; просто не компилируется, нужны скобки.

OneCricketeer 13.09.2018 06:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
1 847
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код сбивает вас с толку, потому что T, определенный в comp, - это прячется, T, определенный в arr. Для объяснения ниже я назову их Tcomp и Tarr.

Tcomp требуется для расширения Comparable, но Tarr для этого не требуется, что означает, что Tarr не может быть «сопоставлен» с Tcomp.

Чтобы исправить это, измените Tarr, поэтому также необходимо расширить Comparable:

public class arr<T extends Comparable<T>>

На стороне примечания:
Ваш класс comp является внутренним классом, но он не использует ничего из внешнего класса, поэтому он должен быть статическим вложенным классом:

static class comp<T extends Comparable<T>> implements Comparator<T>

В качестве альтернативы, оставьте comp как внутренний класс и позвольте ему повторно использовать T из внешнего класса:

class arr<T extends Comparable<T>>
{
    class comp implements Comparator<T>

Но поскольку Java (8 или выше) поставляется с реализацией Comparator для сравнения объектов Comparable, вы должны использовать ее:

public class arr<T extends Comparable<T>>
{
    ArrayList<T> list;
    Comparator<T> comparator;
    public arr()
    {
        list = new ArrayList<T>();
        comparator = Comparator.naturalOrder();
    }
    // rest of code
}

Большое спасибо за подробное объяснение!

pizza 14.09.2018 02:50

@pizza Если это ответ на ваш вопрос, вы должны щелкнуть галочку рядом с вопросом, чтобы другие могли увидеть, что на вопрос был дан ответ удовлетворительно.

Andreas 16.09.2018 19:50

Другие вопросы по теме