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是一个接口,而不是具体的类。这里发生了什么?这是类型擦除问题吗?

Mehrdad Afshari:

如果编译这样的代码是合法的,那么您就可以在:中偷偷插入其他类型的元素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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章