我想定义一个泛型类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。谁能告诉我原因?
答案 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;。请改用它。