2016-04-13 4 views
1

Мне нужно создать метод Merge для объединения двух списков (массивные списки). Мой метод работает, но теперь мне нужно изменить свой метод на дженерики. Это мой метод без дженериков, и он работает. Но у меня есть проблемы с преобразованием его в дженерики.Дженерики в Java, метод слияния

public OrderedArrayList merge(OrderedArrayList list2){ 
     OrderedArrayList result = new OrderedArrayList(length + list2.length); 
     int list1Index = 0; 
     int list2Index = 0; 
     for (int i = 0; i < result.maxSize; i++) { 
      if (list1Index == list.length) { 
       result.insert(list2.list[list2Index]); 
       list2Index++; 
      } else if (list2Index == list2.length) { 
       result.insert(list[list1Index]); 
       list1Index++; 
      } else if (list[list1Index] < list2.list[list2Index]) { 
       result.insert(list[list1Index]); 
       list1Index++; 
      } else { 
       result.insert(list2.list[list2Index]); 
       list2Index++; 
      } 
     } 
     return result; 
    } 

Это моя попытка преобразовать вышеуказанное сообщение в generics.

public <T extends Comparable<T> > OrderedArrayList1<T> merge(OrderedArrayList1<T> list2){ 
     OrderedArrayList1 result = new OrderedArrayList1(length + list2.length); 
     int list1Index = 0; 
     int list2Index = 0; 
     for (int i = 0; i < result.maxSize; i++) { 
      T temp = list[list1Index]; 
      T temp1 = list[list2Index]; 
      if (temp.compareTo(temp1) == 0) { 
       result.insert(list2.list[list2Index]); 
       list2Index++; 
      } else if (temp1.compareTo(temp)==0) { 
       result.insert(list[list1Index]); 
       list1Index++; 
      } else if (temp.compareTo(temp1) < 0) { 
       result.insert(list[list1Index]); 
       list1Index++; 
      } else { 
       result.insert(list2.list[list2Index]); 
       list2Index++; 
      } 
     } 
     return result; 
    } 

Существует много ошибок и не выполняется или работает. Это одна из ошибок, которые я продолжаю получать: Ошибка: несовместимые типы: T не может быть преобразован в T

Спасибо.

+3

Не используйте необработанные типы в своей общей версии. – Savior

+1

Просьба дать объявление вашего класса 'OrderedArrayList1' - в частности, какие переменные типа объявляются на уровне класса. –

+0

Примечание: вам не нужно продолжать оценивать 'temp.compareTo (temp1)' - хранить результат в переменной и использовать это. Кроме того, сравнение * должно быть антисимметричным, поэтому 'temp.compareTo (temp1)' должно быть таким же, как 'temp1.compareTo (temp)'. –

ответ

4

Предполагая, что вы объявили <T extends Comparable<T> > на уровне класса, удалите его на методе:

class OrderedArrayList1<T extends Comparable<T> > { 
    public OrderedArrayList1<T> merge(OrderedArrayList1<T> list2) { 
    ... 
    } 
} 

В противном случае, вы определяете другую переменную типа, который только случается иметь такое же имя, следовательно, немного загадочная «T не может быть преобразован в сообщение T».

Смежные вопросы