为什么我不能将ArrayList分配给List变量?

时间:2011-03-08 08:37:43

标签: java generics

为什么以下代码不起作用?

import java.net.URL;
import java.util.ArrayList;
import java.util.List;

List<List<URL>> announces;
announces = new ArrayList<ArrayList<URL>>();

错误如下:

Type mismatch: cannot convert from ArrayList<ArrayList<URL>> to <List<List<URL>>

4 个答案:

答案 0 :(得分:16)

因为您的Generic 有界类型为List<URL>。即只接受List(这是一个接口)。

您可以使用wildcards允许任何列表。

List<? extends List<URL>> announces;

您还可以考虑subtyping。例如:

List<List<URL>> announces = new ArrayList<List<URL>>();
announces.add(new ArrayList<URL>());
announces.add(new LinkedList<URL>());

这是有效的,因为通用类型接受List<URL>ArrayListLinkedList 是-a List

答案 1 :(得分:3)

试试这个

List<? extends List<URL>> announces = new ArrayList<ArrayList<URL>>();

答案 2 :(得分:0)

因为您的类型转换是错误的。

List<List<URL>> announces; announces = new ArrayList<List<URL>>();

应该有效。 与您使用的List类型无关。如果要强制使用ArrayList,请使用

List<ArrayList<URL>> announces;
announces = new ArrayList<ArrayList<URL>>();

在第一个示例中,您可以在数组列表中插入一个数组列表,应该没有问题,但是您无法更改声明的类型检查,当您声明变量时,您所说的是我想要的允许所有类型的列表,但是您在其中设置的列表只允许使用ArrayLists。有意义吗?

答案 3 :(得分:-1)

ArrayList<ArrayList<URL>> announces = new ArrayList<ArrayList<URL>>();

使用变量接口是无稽之谈。显然你要在其中插入东西,帮自己一个忙,使用确切的类型,你会很高兴。 (您无法插入List<? extends List<URL>>

现在,如果我们公开这个东西,比如从方法中返回它,那么它应该成为一个应该是正确类型的问题。 List<List<URL>>是完美的。 List<? extends List<URL>>你被石头打死了。

我们可以将先前声明的announces作为List<List<URL>>返回吗?当然,为什么不呢。做一个演员,我们知道这是安全的。如果来电者在其中插入LinkedList<URL>怎么办?谁在乎?