2010-02-09 98 views
15

我想有由TA<T>參數化的接口A,也希望每一個實現它,也能實現Comparable(與T及其亞型)類。編寫interface A<T> extends Comparable<? extends T>似乎很自然,但這不起作用。我應該怎麼做呢?Java接口擴展可比

+1

我也想請您看看Java泛型常見問題解答(http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ204),它會給你關於'Comparable'更多的想法。 – 2010-02-09 19:47:31

回答

16

Comparable<? extends T>出現就意味着你的Comparable實例,它可以比較的T一個(未知)亞型,而不是它可以比任何亞型 T.

,但你不因爲Comparable<T>無論如何都可以將其自身與T的任何子類型進行比較,例如Comparable<Number>可以將其自身與Comparable<Double>比較。

所以嘗試:

interface A<T> extends Comparable<T> { 
    // ... 
} 

interface A<T extends Comparable<T>> extends Comparable<A<T>> { 
    // ... 
} 

取決於你是否需要能夠爲了實現你的compareTo方法比較T實例。

+0

這是一個很棒的答案!我來自http://stackoverflow.com/questions/6290406/generic-method-to-sort-a-map-on-values。解決了我的問題。 – 2011-06-09 09:41:34

2

如果使用可比較的方法,您不需要在比較函數中指定子類型的可能性,本質上可以將對象X的任何子類型傳遞給聲明類X的參數的方法。以下代碼可獲取更多信息。

public interface Test<T> extends Comparable<T> { 

} 

class TestImpl implements Test<Number> { 
    @Override 
    public int compareTo(final Number other) { 
     return other.intValue() - 128; 
    } 
} 

class TestMain { 
    public static void main(final String[] args) { 
     TestImpl testImpl = new TestImpl(); 
     testImpl.compareTo(Integer.MIN_VALUE); 
    } 
}