當我創建一個列表時,我希望儘可能地初始化它;所以我用了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
這種方式。有什麼辦法可以優雅地處理這個問題嗎?
它在java 8中工作。 – ZhongYu
@ bayou.io:雖然我接受它的工作原理,但我不明白爲什麼。與數組不同,泛型在Java中從來都不是協變的。教條是陣列是協變和物化的;泛型是不變的,被刪除。 「列表」絕不應該是「列表」的子類型。 –
scottb
@scottb - 在java5-7中,這種情況下的類型推斷只查看參數類型。 Java8改進了類型推斷並考慮了更多的約束,在這種情況下,分配類型; ''NameValuePair>'被推斷爲'asList' – ZhongYu