2016-05-26 189 views
0

有人可以解釋<T extends Number & Comparable<T>>T extends Comparable<? extends Number>之間的區別嗎?泛型之間的區別<T extends Number&Comparable <T>>和T extends Comparable <?擴展號>

這些看起來和我很相似,它們都爲子類型編譯得很好。無效類型ARGS顯示如下錯誤

類型參數不是綁定參數內;應該實現 「java.lang.Number中」

類型參數不是內界參數;應擴展爲 'java.lang.Comparable>'

+1

顯示您的代碼。你在說什麼錯誤?你什麼時候得到它? –

回答

2

您將無法使用:

Comparable<? extends Number> 

因爲Comparable定義的唯一方法是消費者(在PECS的意義上):它需要接受? extends Number類型的實例到其compareTo方法 - 並且沒有類型安全地滿足那個界限。

IntegerComparable<? extends Number>,但Double也是如此。因此,如果這些實例分別具體爲IntegerDouble,因爲Integer.compareTo只能接受Integer參數,因此無法安全地調用instance1.compareTo(instance2)

因此,編譯器會阻止您首先調用此方法。

+0

當你說沒有什麼類型時,你的意思是什麼? Integer類不是滿足約束的類型嗎? – Veeram

+0

@ShivV:他意味着'T'類型的值不能'.compareTo()'任何東西。 – newacct

+0

@ShivV編輯我的答案以添加更多解釋。 –

1

選項1:

public class A <T extends Number & Comparable<T>>{} 

你的通用參數應該擴展數實現可比, 這意味着類A是編號和可比性。

選項2:

public class B <T extends Comparable<? extends Number>>{} 

T是對數字相當(可比較數只),但不必須是數字,不像選項1

我會解釋例如:

A

public class A <T extends Number & Comparable<T>>{} 

public class B <T extends Comparable<? extends Number>>{} 

IntegerWrapper(選項2)

public class IntegerWrapper implements Comparable<Integer> { 

     Integer number; 

     public IntegerWrapper(int number) { 
     this.number = number; 
     } 

     @Override 
     public int compareTo(Integer o) { 
     return number.compareTo(o); 
     } 
    } 

GenericsTest 公共類GenericsTest {

public static void main(String args[]){ 
    A myA = new A<Integer>(); 

    B myB = new B<IntegerWrapper>(); 
    } 
} 

我認爲選項1是你正在尋找的,因爲我想不出許多有用的方案選項2(也許有...)

+0

「T在數字上是可比較的(只能比較數字),但不一定是數字」你能詳細說明一點嗎? – Veeram

+1

T對於數字類型是可比較的,但不需要擴展數字類,如選項1 - > T擴展數字,它的唯一可比較的。並被定義爲T擴展數字。從我的示例IntegerWrapper不擴展Number類,但實現可比較

相關問題