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();
Я могу понять, что это значит по необработанным типам. Я не указываю тип, но каким-то образом он работает, и если я попытаюсь исправить предупреждение, указав тип, то оно выдаст ошибку. Не могли бы вы помочь мне разобраться? Я знаю ... Я новичок, мой код, должно быть, боль в твоих глазах. Я играю с универсальными компараторами и пытаюсь познакомиться со многими вещами. Спасибо.
Ваш код сбивает вас с толку, потому что 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 Если это ответ на ваш вопрос, вы должны щелкнуть галочку рядом с вопросом, чтобы другие могли увидеть, что на вопрос был дан ответ удовлетворительно.
Где вы используете
new comp<T>
? Этот типT
не будет существовать здесь вне ваших классов, и если он существует, то в противном случае он должен быть Сопоставимым типом. Кроме того,new comp;
просто не компилируется, нужны скобки.