java - Generic List 的 Generic List 的初始化

标签 java list initialization

为什么我不能像这样声明一个列表的列表?

List<List<Object>> a = new ArrayList<ArrayList<Object>>();

ArrayList 是 List 类型,所以我假设上面的代码是有效的。

虽然这是有效的:

List<ArrayList<Object>> b = new ArrayList<ArrayList<Object>>();

内部列表必须声明为 ArrayList。

谁能解释一下?

最佳答案

你混淆了你的泛型。做你想做的事情的方法是

List<List<Object>> a = new ArrayList<List<Object>>();

通过使用 ArrayList在通用参数中,您正在缩小 List 对象的范围至 ArrayList ,从而改变通用签名。通过使用 ArrayList在通用之外,您仍然符合要求;您正在指定 List 的哪个实现您想使用,并且它将保存的对象类型为 List<Object> , 与左侧状态完全相同。

要了解为什么这很重要,请考虑以下列表:

// Invalid declaration, but pretend it is valid
List<List<Object>> a = new ArrayList<ArrayList<Object>>();
a.add(new ArrayList<Object>()); // valid
a.add(new LinkedList<Object>()); // not valid because it's not an ArrayList; 
                                 // but according to the left side, it is valid!

当然,最好的方法是使用 Java 7 的 diamond operator :

List<List<Object>> a = new ArrayList<>();

关于java - Generic List 的 Generic List 的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18908232/

相关文章:

Go - 变量已初始化且非 nil,但其他函数为 nil

java - org.apache.http.client.HttpResponseException : Bad Request - Sending JSON request via REST

java - Thymeleaf 无法解析多模块 Spring Boot 项目中的模板

java - 如何在不损失质量并保持宽高比的情况下缩小图像?

python - Python 列表有等同于 dict.get 的东西吗?

c++ - 为什么不能在类主体中分配变量?

java - 数组第二维初始化失败 - Java

java - 保存列表数组

python - 删除或更改列表中的特定重复元素(并非所有重复元素)

python - 用列表表示 boolean 表达式