在列表中比较通用的麻烦

时间:2012-03-24 19:00:13

标签: java generics

我想让以下方法不显示有关使用原始类型的警告,但我无法弄清楚语法,告诉它做我想要的。这是目前的方法:

static long countSplitInversions(List<? extends Comparable> list) {
    long inversions = 0;

    final int leftLimit = list.size() / 2;
    int left = 0;
    int right = leftLimit;

    for (int i = 0; i < list.size(); i++) {
        if (left == leftLimit || right == list.size()) {
            break;
        }
        if (list.get(left).compareTo(list.get(right)) <= 0) {
            left++;
        } else {
            right++;
            inversions += leftLimit - left;
        }
    }

    return inversions;
}

当我更改签名以避免警告时:

static <T> long countSplitInversions(List<? extends Comparable<? super T>> list)

然后使用错误编译compareTo的行:

Method compareTo in interface java.lang.Comparable<T> cannot be applied to given tyes
required: capture #1 of ? super T
found: java.lang.Comparable<? super T>

2 个答案:

答案 0 :(得分:4)

考虑将方法签名更改为......

static <T extends Comparable<? super T>> long countSplitInversions(List<T> list) {

答案 1 :(得分:1)

您的意思是警告或编译错误吗?

您当前的代码已生成警告,但如果您的意思是编译器错误,正如您在最后建议的那样,则需要为Comparable绑定指定类型参数。

有点像这样会产生你建议的编译器错误。

static long countSplitInversions(List<? extends Comparable<?>> list) {
 / /...
}

但那没有意义,你可以对你的同类物品做任何事情。

因此,您可能需要一个类型参数,如另一个答案所示。