为什么以下代码不起作用?
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>>
答案 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>
和ArrayList
,LinkedList
是-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>
怎么办?谁在乎?