我有一个接受二维列表(List<List<String>>
)作为参数的方法。当我尝试传递一个2d ArrayList ArrayList<ArrayList<String>>
时,编译器说两者无法转换?
public class Test
{
public static void main(String[] args)
{
test(new ArrayList<ArrayList<String>>());
}
public static void test(List<List<String>> list)
{
return;
}
}
我认为测试会接受一个ArrayList,因为它是一个ArrayList is-a
列表。
答案 0 :(得分:2)
ArrayList<String>
是List<String>
,但这并不意味着List<ArrayList<String>>
是List<List<String>>
。在Java中,泛型是不变的,所以这是不允许的。
您可以将ArrayList<List<String>>
传递给test
方法。完全匹配泛型类型参数将始终有效。
test(new ArrayList<List<String>>());
或者,另一种方法是让list
方法中的test
参数具有通配符:
public static void test(List<? extends List<String>> list)
或者您可以让方法完全匹配参数。
public static void test(List<ArrayList<String>> list)
这两项都允许您传入ArrayList<ArrayList<String>>
。
答案 1 :(得分:2)
您可以在LinkedList<String>
中添加List<List<String>>
,但无法将同一LinkedList<String>
添加到ArrayList<ArrayList<String>>
。允许您建议的将破坏该类型的安全性。
ArrayList<ArrayList<String>>
不是List<List<String>>
,不是该类型参数的有效参数。