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.任何帮助都非常感谢。
答案 0 :(得分:4)
您有两个不同的泛型类型参数,名为T - 一个在类级别,另一个在getLongestSubsequence
方法。这两者没有关系,即使它们具有相同的名称。因此comparator.compare
不接受与传递给getLongestSubsequence
方法的列表的元素类型相同类型的参数。
当前编写类时,您可以创建LCCS<String>
的实例,然后使用两个getLongestSubsequence
参数调用List<Integer>
方法。 comparator.compare()
会预计会有两个String
,而您的代码会将两个Integer
传递给它。这就是你的代码没有通过编译的原因。
只需从<T>
声明中删除getLongestSubsequence
,即可使其使用班级T
。
答案 1 :(得分:4)
此处定义 classlevel 的类型参数T
:
public class LCCS<T extends Comparable<T>> {
稍后,此代码为方法的范围定义名为T
的另一个类型参数; 阴影类级别声明:
private <T> Subsequence<T> getLongestSubsequence(...
更改此代码。让方法重新使用类级别参数T
:
private Subsequence<T> getLongestSubsequence(...