代码之家  ›  专栏  ›  技术社区  ›  notaorb

如果List是一个抽象接口,那么Collectors.toList()如何处理流?

  •  0
  • notaorb  · 技术社区  · 2 年前

    我知道这不会起作用,因为List是一个抽象接口:

    List<Integer> l = new List<>();
    

    这就是为什么我一直在使用 ArrayList<>

    我很好奇为什么以下内容在对象的赋值中有效 List<String> l :

    ArrayList<E> al = new ArrayList<>();
    List<String> l = al.stream().collect(Collectors.toList());
    

    我的理解是,对象不能从接口创建,只有当它们已经实现时。有人能解释为什么第二个代码片段有效,以及我应该如何理解这种差异吗?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Robby Cornelissen    2 年前

    Collectors.toList() 会还你的 一些 混凝土 List 例子也许是 ArrayList ,也许还有别的。API愿意保证的只是它符合 列表 界面

    这个 Javadoc 明确指出:

    不能保证类型、可变性、可序列化性或 的线程安全性 列表 返回;如果对返回的有更多的控制 列表 是必需的,使用 toCollection(Supplier)

    您可以检查在运行时返回的特定类型,但不应该依赖它。