Устранение ошибки Java generics

#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. Опять же, вам может потребоваться поработать с интерфейсами. Если мы не знаем больше о других связанных целях проектирования, трудно давать советы. С точки зрения кода ошибка правильная и оправданная.