2014-09-30 14 views
0

如果要使用Arrays類中的sort()方法,您必須實現Comparable接口。這是一個非常好的主意 - 如果對象不兼容,則無法對對象進行排序。所以你不能排序,如果你不能比較它的參考。在這種情況下,接口就像兼容性檢查器一樣使用。如果要使用它的方法,需要使用接口的Java類

的問題是 - 如何才能讓:

  • 與方法的類(可以做2個對象的東西)

  • 接口來檢查,如果這2個對象都是comatible(具有兼容參考)

  • 添加到我的課「必須使用此接口」的規則,所以你不能使用這個類的方法沒有實現特定的接口,就像Comparable類呢?

例子:

public class Employee implements Comparable<Employee> { 
//fields 
//setters, getters 

    // this method must be implemented to use Arrays.sort() 
    public int compareTo(Employee other) { 
     return Double.compare(salary, other.salary); 
    } 
} 
+1

你能解釋一下你的要求嗎?這聽起來像你希望能夠在運行時確定一個類是否應該實現「Comparable」。它是否正確? – deyur 2014-09-30 20:23:23

+0

我不完全瞭解你的要求;我更喜歡一個你想讓_your_類看起來像什麼的例子,以及你的類的使用例子,你可以不想或不想要。不速之客,我想你會希望使用泛型''或使用'instanceof'在運行時檢查。 – ajb 2014-09-30 20:23:55

+0

「如果不實現特定的接口,則不能使用此類方法」。你什麼意思?你想執行哪個實現接口的人?班級的客戶還是班級本身?你能重新表達這個問題嗎? – Claudio 2014-09-30 20:24:51

回答

2

的接口不能檢查什麼。

你可以這樣寫:

interface One { } 
interface Two { } 

SomeType someMethod(One one, Two two) { ... } 

編譯器不會允許任何人的代碼來調用的someMethod(A,B),除非其能證明是一些類的實例implements One和b是一個實例的一些類implements Two

這是你在問什麼?


新增信息:

Arrays.sort(Object[] a)不同的是:編譯不知道數組中的元素是否實現Comparable接口與否。該信息在運行時纔可用。

我不知道java.util.Arrays.sort()是怎麼做的,但你要做到同樣的事情在自己的代碼,你可以這樣寫:

interface One { } 
interface Two { } 

SomeType someMethod(Object oneAsObject, Object twoAsObject) { 
    One one = One.class.cast(oneAsObject); 
    Two two = Two.class.cast(twoAsObject); 
    ... 
} 

這是與我的第一個示例不同,因爲編譯器將允許您傳入任何類型的對象,但如果傳遞了錯誤類型的對象,該函數將在運行時拋出ClassCastException。

但是,爲什麼你要等到運行時才能找到一個你可能在編譯時發現的錯誤? (例如,何必等到着陸器的下降向火星表面發現它推出之前,你可能已經發現了一個致命的缺陷?)

+0

謝謝我認爲是的,我需要測試:) – RichardK 2014-09-30 20:28:34

0

響應您的評論:

Yes, what I mean is: if you wan't to use sort() you must implement comparable. So the question is - can I determine, that you must use some X interface if you want to use my X method.

你可以這樣做抽象類。想要使用methodB

public interface MyInterface { 
    public void methodA(); 
} 

public abstract class MyAbstractClass implements MyInterface { 
    public void methodB(
     System.out.println("Pop"); 
    ) 
} 

事情,都必須擴展MyAbstractClass,因此必須實現MyInterface

相關問題