[英]Is the compareTo method (in the Comparable interface) recursive?
[英]Extending comparable interface and override compareTo
我知道這已被問過1000次,我已經看到了1000個答案,但我沒有看到任何對我有用的東西。
我必須對實現我自己的接口的對象列表進行排序。 我決定擴展Comparable接口並為這些對象實現compareTo方法。
我的界面:
public interface Field extends Comparable<Field> {
}
我的對象類
public class ConcreteField implements Field {
public int compareTo(Field other){
return this.getName().compareTo(other.getName());
}
}
這不像我期望的那樣有效。
編譯器似乎認識到ConcreteField必須實現compareTo。 沒關系。
通過上面的示例,我可以比較ConcreteField對象。 但不是當它們的界面(Field)代表它們時。
我可以對ConcreteField列表進行排序,但我無法對Field of List進行排序。 當然這是自然的,因為compareTo的實現在ConcreteField中,但我希望java會在實現Field的每個具體對象上調用compareTo。 似乎並非如此。
但是,您如何實際排序由其可比較的界面表示的對象?
另一個我不知道的奇怪的事情。
使用@Override over compareTo方法會使編譯器大喊大叫:ConcreteField類型的compareTo(Field)方法必須覆蓋或實現超類型方法。 咦? 沒有超類型,它只是實現了一個接口。
當我從ConcreteField類中刪除compareTo時。 編譯器抱怨它必須實現。 當我使用eclipse quickfix,它說“實現缺失的方法”時,它沒有這樣做並告訴我“無法實現丟失的方法,無論是由於編譯器錯誤還是項目構建路徑都無法解決所有依賴關系”。
完全沒有依賴性。 它全部在同一個項目甚至同一個包中。 那到底是怎么回事呢?
@Masud:你建議的實施(發布刪除)
創建一個界面,如:
public interface Field<T> extends Comparable<T> {
public String getName();
}
創建一個ConcreteField類,如:
import java.util.Arrays;
public class ConcreteField implements Field<Field>{
private String name;
@Override
public int compareTo(Field other) {
return this.name.compareTo(other.getName());
}
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
ConcreteField[] c = new ConcreteField[3];
c[0] = new ConcreteField();
c[1] = new ConcreteField();
c[2] = new ConcreteField();
c[0].setName("c");
c[1].setName("b");
c[2].setName("a");
Arrays.sort(c);
for(int i=0;i<c.length;i++) {
System.out.println(c[i].getName());
}
}
}
我得到的輸出是排序的。
a
b
c
請在下面找到我的代碼和解釋。
public interface Field extends Comparable<Field> {
}
接口實現Comparable接口。 以下是實施。
Java總是查看引用的類型。 如果您通過接口引用對象,那么您將只看到接口和常量中的方法。
如果您有任何疑問,請告訴我。
public class ConcreteField implements Field {
private String name;
/**
* @return the name
*/
public String getName() {
return name;
}
public ConcreteField(String name) {
this.name = name;
}
@Override
public int compareTo(Field o) {
ConcreteField cf = (ConcreteField) o;
return this.getName().compareTo(cf.getName());
}
public static void main(String[] args) {
List<Field> list = new ArrayList<Field>();
list.add(new ConcreteField("test"));
list.add(new ConcreteField("abc"));
list.add(new ConcreteField("dec"));
list.add(new ConcreteField("mef"));
list.add(new ConcreteField("keg"));
list.add(new ConcreteField("sdf"));
list.add(new ConcreteField("abc"));
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("ConcreteField [name=");
builder.append(name);
builder.append("]");
return builder.toString();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.