如何定义一个通用的可比数组类?

时间:2016-12-10 08:20:55

标签: java generics

我想定义一个泛型类ComparableList<>扩展ArrayList并实现Comparable接口,这样可以使用compareTo方法比较ComparableList类型的两个对象。 compareTo应该执行字典比较。 这是我的代码:

class ComparableList <T extends Comparable<T>> extends ArrayList implements Comparable<ComparableList>{
@Override
    public int compareTo(ComparableList o){
        Iterator citer = this.iterator();
        Iterator oiter = o.iterator();
        while (citer.hasNext() && oiter.hasNext()){
            if (citer.next() > oiter.next()){
                return 1;
            }else if (citer.next() < oiter.next()){
                return -1;
            }else {
                if (!citer.hasNext()){
                    return -1;
                }
                if(!oiter.hasNext()){
                    return 1;
                }
            }
        }
        return 0;
}

}

我收到如下错误消息:

TCL.java:11: error: bad operand types for binary operator '>'
            if (citer.next() > oiter.next()){
                             ^
first type:  Object
second type: Object
TCL.java:13: error: bad operand types for binary operator '<'
            }else if (citer.next() < oiter.next()){
                                   ^
first type:  Object 
second type: Object

我认为它应该是ComparableList而不是Object。谁能告诉我原因?

3 个答案:

答案 0 :(得分:1)

您需要使用Comparable.comapreTo()比较对象(这就是为什么<T extends Comparable<T>存在的原因)。您需要首先检查任何一方的空值。

此外,每次调用Iterator.next()都会迭代到下一个元素,您不想在一次循环迭代中调用它两次 - 将项目存储在循环开始处然后使用存储的值。

答案 1 :(得分:1)

Comparable不会覆盖><运算符(什么都不能)。由于您的T实施Comparable,请使用compareTo

int result = citer.next().compareTo(oiter.next());
if (result != 0) {
    return result;
} else {
    if (citer.hasNext()) {
        return -1;
    }
    if (oiter.hasNext()) {
        return 1;
    }
}

请注意,由于next提升了迭代器,因此每次迭代也只需一次 next

答案 2 :(得分:1)

ComparableList中的每个元素都是T extends Comparable<T>类型,确保二元运算符不可用(Java没有运算符重载),但是因为它扩展了Comparable ,你有compareTo用作替换&lt;和&gt;。请改用它。