我有一个关于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
是一个接口,而不是具体的类。这里发生了什么?这是类型擦除问题吗?
如果编译这样的代码是合法的,那么您就可以在:中偷偷插入其他类型的元素HashMap
:
HashMap<IssueType, List<Issue>> a = new HashMap<IssueType, ArrayList<Issue>>();
a.put(someIssue, new SomeClassThatImplementsListOfIssueButIsNotArrayList());
这不是您所期望的。ArrayList<String>
是List<String>
,但这不足以使此代码安全和正确。为了安全起见,它还必须List<String>
为ArrayList<String>
,这意味着此处的泛型类型参数不是协变的。
您的最后一个代码是合法的,因为没有任何要求将type参数作为具体类。同样,什么也不需要字段是抽象类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句