2016-05-18 4 views
3

Идея Intellij дает мне эту ошибку: «сравнить (T, T) в компараторе нельзя применить к (T, T)» для следующего код:Сравнение (T, T) в компараторе нельзя применять к (T, T)

public class LCCS<T extends Comparable<T>> { 

    private Comparator<T> comparator; 

    public LCCS(Comparator<T> comparator) { 
     this.comparator = comparator; 
    } 


    /** 
    * Loops the two given lists for finding the longest subequence 
    * 
    * @param list1 first list. 
    * @param list2 second list. 
    * @param <T> list item type. 
    * @return LCCS and the sublist indices of the subsequence in list1 and list2. 
    */ 
    private <T> Subsequence<T> getLongestSubsequence(List<T> list1, List<T> list2) { 
     Subsequence<T> output = null; 
     for (int indexList1 = 0; indexList1 < list1.size(); indexList1++) 
      for (int indexList2 = 0; indexList2 < list2.size(); indexList2++) 
       if (comparator.compare((T)list1.get(indexList1), (T)list2.get(indexList2)) //Here comes the error 
     output = inspectsubsequence(list1, list2, indexList1, indexList2, output); 
     return output; 
    } 
} 

Я уже изменил параметризированном тип Т и он все еще показывает мне сообщение, но вместо захвата только T. Любая помощь очень ценится.

+0

Его только часть класса ха-ха. –

ответ

4

У вас есть два разных типа типовых параметров с именем T - один на уровне класса, а другой - по методу getLongestSubsequence. Эти два не связаны друг с другом, хотя они имеют одно и то же имя. Поэтому comparator.compare не принимает те же типы аргументов, что и тип элемента списков, переданных методу getLongestSubsequence.

Поскольку класс в настоящее время написан, вы можете, например, создать экземпляр LCCS<String>, а затем вызвать метод getLongestSubsequence с двумя аргументами List<Integer>. comparator.compare() тогда ожидал бы двух String s, а ваш код передал бы ему два Integer. Вот почему ваш код не передает компиляцию.

Просто удалите <T> из декларации getLongestSubsequence, что приведет к ее использованию на уровне T.

+0

Зачем мне нужно расширять >? Требуется ли расширение? –

+0

@CeesMandjes Возможно, вам это не нужно. Я не могу сказать, не видя ваш полный код. Наличие 'extends Comparable ' type bound позволяет вам вызывать 'compareTo (T)' на экземплярах T внутри вашего класса. Например, если 'compator' равно null, вы можете вызвать' list1.get (indexList1) .compareTo (list2.get (indexList2)) 'вместо' comparator.compare (list1.get (indexList1), list2.get (indexList2)) '. – Eran

4

Тип параметра T в classlevel определено здесь:

public class LCCS<T extends Comparable<T>> { 

В дальнейшем, этот код определяет другой параметр типа с именем T для сферы применения метода; это тени classlevel декларации:

private <T> Subsequence<T> getLongestSubsequence(... 

Изменить этот код. Пусть метод resuse параметр типа в classlevel в T:

private Subsequence<T> getLongestSubsequence(... 
+0

Почему мне нужно расширять >? Требуется ли расширение? –

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