2015-06-02 15 views
1

我有一個類接收2個未知的通用對象x和y。如果它們具有可比性,我必須將它們與對象進行比較。我想通了,我可以檢查對象通過使用instanceof實現Comparable界面,但我不知道我怎麼可以使用.compareTo方法雖然我知道對象實現他們 -使用已知的通用對象方法

我想要做的是什麼基本上這與x和y通用對象:

public void someMethod(E x, E y) { 
    if (x instanceof Comparable && y instanceof Comparable) { 
     if(x.compareTo(y) < 0){ //The method compareTo(E) is undefined for the type E 
      //do stuff 
     } 
    } 
} 

有人可以指出我在正確的方向?

回答

0

檢查後,您可以(也應該)安全地投射物體以根據需要使用它們。

if (x instanceof Comparable && y instanceof Comparable) { 
    Comparable c1 = (Comparable) x; 
    Comparable c2 = (Comparable) y;   
    if(c1.compareTo(c2) < 0){ 
     //do stuff 
    } 
} 
+0

我不知道鑄造到接口是可能的,謝謝!正確的答案,因爲我不知道泛型元素是否會引起Comparable。 –

+1

不應該使用原始類型 – newacct

3

您需要指定一個泛型類型綁定。眼下E可以是任何Object類型,但它看起來像你想將其限制於實現Comparable任何類型的,這將是這樣的:

public <T extends Comparable<? super T>> void someMethod(T x, T y) { 
    if (x.compareTo(y) < 0) { 
     //do stuff 
    } 
} 

的備選答案暗示鑄造是正確的,但不是一個很好的解決方案:如果你知道'x'和'y'實現了Comparable,那麼你應該限制它們。

+1

以獲得最佳效果使用'>' – newacct

1

你應該申報方法類似

public <E extends Comparable<E>> void someMethod(E x, E y) 

所以在你的方法,你可一定要使用compareTo方法。

+1

好主意,但看起來他已經在課程級別綁定了一個'''E'''類型,一個for someMethod會影響另一個(這不是很好,並且通常在編碼風格中是禁止的)。簡單地把'''E'''改成另一個標識符(例如'''T''')就可以解決這個問題。 – Toby

+0

@Toby好點。你比我更近了;) –