2012-01-30 45 views
1

我有以下方法:插入通用號碼ArrayList中的Java

private <E extends Number> void AddOne(ArrayList<E> al, Double num) { 
     al.add(num); 
    } 

al.add(NUM)不起作用。什麼是我可以將數字插入通用數組數組的最佳方式?

所以基本上,我有一個通用的

的ArrayList < E>人

我想插入它的數值,我該怎麼辦呢? (我記得C++很容易-_-)

+2

不工作意味着什麼?你在期待什麼,你有什麼?沒有這些細節,很難回答任何問題。 – kosa 2012-01-30 20:04:01

+2

你的'ArrayList'是E的列表,所以你可以插入它的必須是一個E或一個子類。 'Double'是一個'Number',但它不一定是E;你必須將它投射到E才能使用。這真的是你需要的簽名嗎? – 2012-01-30 20:08:03

+0

沒有「擴展」的ArrayList 呢? – Luciano 2012-01-30 20:08:08

回答

3

你不能在這個列表中添加anythig,因爲你不知道它是什麼類型。

考慮繼承樹是這樣的:

Number 
| 
|- BigInteger 
      | 
      |- NonNegativeInteger 
           | 
           |-PositiveInteger 

你說你的名單是從Number繼承元素的列表。好吧,所以假設你想添加Number到列表中,但是等待你可以有List<BigInteger>,並且你不能把Number加入到列表中。

好吧,所以你可以把BigInteger,對不對?沒有!因爲你的清單可能是List<NonNegativeInteger>。而且這個故事還在繼續......

聲明列表爲List<T extends SomeObject>可以確保當你從列表中獲得某些東西時,它的類型爲SomeObject。沒有其他人知道。

那麼如何避免這個問題呢?只需刪除模板。

List<Number> 

現在你可以把任何東西從Number繼承。

或者說,什麼是更好的在你的情況下,改變DoubleE

private <E extends Number> void AddOne(ArrayList<E> al, E num) { 
    al.add(num); 
} 
+1

+1以便於解釋,並且作爲一個附註,你可以使用ArrayList <?超級號碼>然後用它來存儲數字。 – wmz 2012-01-30 20:47:16

1

你的意思呢?

private void AddOne(ArrayList<Number> al, Double num) { 
     al.add(num); 
    } 
1

我認爲你真正想要的是:

private void AddOne(ArrayList<Number> al, Double num) { 
    al.add(num); 
} 

,否則你不能到列表與添加劇組到E

2

你應該改變你的加入添加任何東西:

private <E extends Number> void AddOne(ArrayList<E> al, E num) { 
     al.add(num); 
    } 

然後在你的泛型類的任何具體實例中,其中E解析爲特定的數字類別,您將可以添加該類型的數字。

2

你的方法沒有意義。您想要將Double添加到ArrayList,該ArrayList被定義爲包含任何延伸爲Number的類。

如果您通過的數組是ArrayList<Integer>,並且您嘗試將其添加到Double,會發生什麼情況?

如果您只對擁有Number的子類的東西ArrayList感興趣,則不需要泛型;只需使用一個ArrayList<Number>