为什么2d ArrayList不能转换为2d List我的方法调用转换?

时间:2014-07-01 21:58:39

标签: java inheritance arraylist polymorphism

我有一个接受二维列表(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列表。

2 个答案:

答案 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>>,不是该类型参数的有效参数。