[英]How to define a generic comparable array class?
我想定義一個通用類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。 誰能告訴我原因?
您需要使用Comparable.comapreTo()
比較這些對象(這就是為什么您在其中<T extends Comparable<T>
)。 您需要首先檢查兩邊是否為空。
另外,每次對Iterator.next()
調用都會迭代到下一個元素,您不想在一個循環迭代中兩次調用它-在循環開始時存儲項目,然后使用存儲的值。
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
先進的迭代器。
您的ComparableList
中的每個元素的類型都是T extends Comparable<T>
,以確保二進制運算符對此不可用(Java沒有運算符重載),但是由於它擴展了Comparable
,因此您可以使用compareTo
來代替<和>。 改用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.