Intellij的主意是给我这个错误:对于以下代码,“比较器中的比较(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,它仍然显示消息,但不仅仅是捕获T。非常感谢您的帮助。
最佳答案
您有两个名为T的不同通用类型参数-一个在类级别,另一个在getLongestSubsequence
方法中。尽管它们具有相同的名称,但两者并不相关。因此,comparator.compare
不接受与传递给getLongestSubsequence
方法的列表的元素类型相同的参数类型。
当前正在编写类时,例如,您可以创建LCCS<String>
的实例,然后使用两个getLongestSubsequence
参数调用List<Integer>
方法。然后comparator.compare()
会期望两个String
,而您的代码将传递给它两个Integer
。这就是为什么您的代码不通过编译的原因。
只需从<T>
的声明中删除getLongestSubsequence
,这将使它使用类级别T
。