Java 如何创建ArrayList的ArrayList,使其符合程序到接口的原则

Java 如何创建ArrayList的ArrayList,使其符合程序到接口的原则,java,list,arraylist,Java,List,Arraylist,我知道这个问题已经被讨论过了,但我从另一个角度看待它。 答案是什么。然而,我正在寻找最佳实践和编程接口。然后我提出了以下三个选项 问题: 为什么选项1是编译错误?为什么转换不能进行 选项2或3中的哪一个是首选的,在哪里 在选项3中,为什么界面“列表”出现在语句的右侧?请对此提供适当的答复。我需要理解这些嵌套的泛型定义 1) List<List<Integer>> arList1 = new ArrayList<ArrayList<Integer>>

我知道这个问题已经被讨论过了,但我从另一个角度看待它。 答案是什么。然而,我正在寻找最佳实践和编程接口。然后我提出了以下三个选项

问题:

  • 为什么选项1是编译错误?为什么转换不能进行

  • 选项2或3中的哪一个是首选的,在哪里

  • 在选项3中,为什么界面“列表”出现在语句的右侧?请对此提供适当的答复。我需要理解这些嵌套的泛型定义

     1) List<List<Integer>> arList1 = new ArrayList<ArrayList<Integer>>();
     2) List<ArrayList<Integer>> arList2 = new ArrayList<ArrayList<Integer>>();
     3) List<List<Integer>> arList3 = new ArrayList<List<Integer>>();
    
    1)列表arList1=newarraylist();
    2) List arList2=新的ArrayList();
    3) List arList3=新的ArrayList();
    
  • 此代码:

    List<List<Integer>> arList1 = new ArrayList<ArrayList<Integer>>();
    
    编译器将填写
    列表
    ,作为右侧的泛型类型参数。对于Java6和更早版本,您需要显式地为构造函数调用提供一个与赋值左侧的泛型参数兼容的泛型参数


  • 选项1是编译错误,因为类型不兼容。实际上,您可以将不是
    数组列表的
    列表
    放入
    列表
    ,但不能放入
    数组列表
    。这就是为什么
    列表
    出现在选项3的右侧

    首选选项3,因为它通过对象的接口引用对象。参见Joshua Bloch,《有效的Java:编程语言指南》,第34项

    List<List<Integer>> arList1 = new ArrayList<>();