我有一個關於Java泛型和集合的問題。它被認爲是很好的做法,申報的集合是這樣的:Java泛型和集合
List<String> catNames = new ArrayList<String>();
,因爲你可以改變List
的類型,而不必擔心破壞你的代碼的其餘部分。但是,當我嘗試這樣做:
private static Map<IssueType, List<Issue>> orphanedAttrMap = new HashMap<IssueType, ArrayList<Issue>>();
javac
抱怨
Type mismatch: cannot convert from HashMap<ResultsAggregator.IssueType,ArrayList<Issue>> to HashMap<ResultsAggregator.IssueType,List<Issue>>
此外,這是完全合法的:
private static Map<IssueType, List<Issue>> orphanedAttrMap = new HashMap<IssueType, List<Issue>>();
這似乎更加混亂,因爲List
是一個接口,不是具體的課程。這裏發生了什麼?這是一個類型擦除問題?
但是,在第一種被認爲是「良好實踐」的情況下,情況是不是也如此? – 2010-12-18 04:20:11
啊我明白了,那雖然很奇怪...... – 2010-12-18 04:21:10
@Amir:不,它不是。第一行聲明一個'List'類型的變量。如果稍後將某個其他列表分配給該變量,則將完全替換該實例。 ArrayList中沒有改變內容。你無法用這條線做一些壞事。 –
2010-12-18 04:23:07