gpt4 book ai didi

java - 如何创建ArrayList的ArrayList,使其符合程序接口(interface)原则

转载 作者:行者123 更新时间:2023-11-30 03:45:03 25 4
gpt4 key购买 nike

我知道这个问题已经被问过,但我正在从不同的角度看待它。提供了关于 generic type for ArrayList of ArrayLists 的答案。是。然而,我正在寻找最佳实践和编程接口(interface)。然后我想出了以下三个选项。

问题:

  1. 为什么选项1编译错误?为什么无法转换?

  2. 首选选项 2 或 3 中的哪一个?

  3. 选项3中为什么语句的右侧出现了“List”界面?请对此提供适当的答案。我需要理解这些嵌套的通用定义。

     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. 此代码:

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

    是一个编译错误,因为 List<List<Integer>>可以合法持有LinkedList<Integer> ,但赋值的右侧不能。泛型不是协变的。 (参见优秀的article on generics by Brian Goetz。)

  2. 我更喜欢 3,除非我想明确要求将列表添加到 arList2必须是 ArrayList 的实例。虽然这样的要求相当罕见,但还是有可能出现。

  3. 在 Java 7 中,您不需要这样做。你可以写:

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

    编译器会填写List<Integer>作为右侧的泛型类型参数。对于 Java 6 及更早版本,您需要显式地向构造函数调用提供一个与赋值左侧的泛型参数兼容的泛型参数。

关于java - 如何创建ArrayList的ArrayList,使其符合程序接口(interface)原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com