Универсальный компаратор Java - PullRequest
0 голосов
/ 13 сентября 2018
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);
    }
}

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

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();

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

1 Ответ

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

Ваш код вводит вас в заблуждение, потому что 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
}
...