#java
#java
Вопрос:
У меня есть несколько обобщений в следующем коде:
public <T extends Comparable<T>> int insertionSort(T[] a) {
// throw new RuntimeException("not implemented");
final int L = a.length;
int compares = 0;
for(int i = 1; i < L; i ){
for(int j = i; j > 0 amp;amp; a[j].compareTo(a[j - 1]) < 0; j--){
Comparable tmp = a[j]; // PROBLEM HERE
a[j] = a[j - 1];
a[j - 1] = tmp; // PROBLEM HERE
compares ;
}
}
return compares;
}
// PROBLEM HERE
— эти две строки в коде имеют ошибку.
Ошибки заключаются в том, что я не могу выполнять назначения.
Комментарии:
1. Какой симптом, который вы видите, заставляет вас полагать, что есть проблема?
2. ошибки в том, что я не могу выполнять назначения
3. В
array[j].compareTo(array[j - 1]) < 0
чем заключаетсяarray
?4. Какое сообщение об ошибке вы получаете ? Вы это читали?
5. Массив @Mike — это a. я это исправил
Ответ №1:
a[j]
является a T
, а не a Comparable
.
Вы можете поместить его только в переменную типа T
.
Ответ №2:
Ваша проблема в том, что Comparable
это интерфейс, а не класс. вам нужно создать объект класса, который реализует Comparable
.
Если T
реализуется Comparable
, вы можете объявить tmp как a T
и использовать это:
T tmp = a[j];
a[j] = a[j - 1];
a[j - 1] = tmp;
Ответ №3:
вместо сопоставимого tmp используйте T tmp, и я думаю, это должно исправить.
Ответ №4:
Что нужно записать в вашем коде:
- Ваше определение T является рекурсивным. Может быть разработан интерфейс, если вам нужно.
-
Ваше назначение неверно, как четко указано компилятором! 🙂
Сопоставимый tmp = a[j];
это будет работать, потому что это верно и правильно. Поскольку T расширяет Comparable , T является сопоставимым.
a[j - 1] = tmp;
Это не сработает, потому что вы пытаетесь назначить экземпляр суперкласса экземпляру подкласса. Сопоставимое поведение не гарантируется. Отсюда и ошибка.
Вы можете попробовать параметризовать свой класс, в котором находится эта функция. Используйте этот параметр для определения T. Опять же, вам может потребоваться поработать с интерфейсами. Если мы не знаем больше о других связанных целях проектирования, трудно давать советы. С точки зрения кода ошибка правильная и оправданная.