2015-08-28 18 views
4

當我創建一個列表時,我希望儘可能地初始化它;所以我用了Arrays.asList。但是,它似乎不是繼承的協變。在Java中使用Arrays.asList的協方差?

例如,

List<NameValuePair> p = Arrays.asList(new BasicNameValuePair("c", coin), new BasicNameValuePair("mk_type", fromCoin)); 

不起作用(BasicNameValuePair是派生類的NameValuePair)。

儘管可以照常使用add

List<NameValuePair> pairs = new ArrayList<>(); 
pairs.add(new BasicNameValuePair("c", coin)); 
pairs.add(new BasicNameValuePair("mk_type", fromCoin)); 

由於庫API只接受List<NameValuePair>類型作爲參數,我必須定義pairs這種方式。有什麼辦法可以優雅地處理這個問題嗎?

+1

它在java 8中工作。 – ZhongYu

+0

@ bayou.io:雖然我接受它的工作原理,但我不明白爲什麼。與數組不同,泛型在Java中從來都不是協變的。教條是陣列是協變和物化的;泛型是不變的,被刪除。 「列表」絕不應該是「列表」的子類型。 – scottb

+2

@scottb - 在java5-7中,這種情況下的類型推斷只查看參數類型。 Java8改進了類型推斷並考慮了更多的約束,在這種情況下,分配類型; ''NameValuePair>'被推斷爲'asList' – ZhongYu

回答

5

如果我明白你的問題,那麼我相信你可以使用的方法調用的明確泛型類型來Arrays.asList

List<NameValuePair> p = Arrays.<NameValuePair>asList(new BasicNameValuePair(
     "c", coin), new BasicNameValuePair("mk_type", fromCoin)); 

Generic Methods (The Java Tutorials)

3

您只需給它一個通用的提示:

List<NameValuePair> p = Arrays.<NameValuePair>asList(new BasicNameValuePair("c", coin), new BasicNameValuePair("mk_type", fromCoin));