比较器中的compare(T,T)不能应用于(T,T)

时间:2016-05-18 07:18:33

标签: java class generics intellij-idea comparator

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.任何帮助都非常感谢。

2 个答案:

答案 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(...