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

10-08 16:15