我知道这是行不通的,因为List是一个抽象接口:

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

这就是为什么我一直使用典型的ArrayList<>.

我很好奇为什么下面的代码在将一个对象赋值为List<String> l时是有效的:

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

我的理解是,只有在实现了对象之后,才能从接口创建对象.谁能解释一下第二个代码片段为什么工作,以及我应该如何理解这种差异?

推荐答案

Collectors.toList()将返回some个具体的List实例.可能是ArrayList,也可能是其他的.API愿意保证的是它符合List接口.

Javadoc条明确规定:

不能保证类型、可变性、可序列化或 返回的List的线程安全性;如果对返回的 List是必需的,请使用toCollection(Supplier).

您可以判断在运行时返回的特定类型,但不应依赖于它.

Java相关问答推荐

空手道比赛条件

Java List with all combinations of 8 booleans

Apache POI:使用反射获取zoom 级别

如何打印本系列的第n项y=-(1)-(1+2)+(1+2+3)+(1+2+3+4)-(1+2+3+4+5)...Java中的(1+2+3+4...+n)

扩展到弹出窗口宽度的JavaFX文本字段

Spark上下文在向Spark提交数据集时具有内容,但Spark在实际构建它时发现它为空

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

Spring和可编辑";where";@Query

使用UTC时区将startDatetime转换为本地时间

如何在一行中使用Dijkstra中的Java Stream

%This内置函数示例

支持MySQL 5.6的最新Hibernate版本

允许同时执行两个方法,但不能同时执行这两个方法

如何读取3个CSV文件并在控制台中按顺序显示?(Java)

当我在Java中有一个Synchronized块来递增int时,必须声明一个变量Volatile吗?

组合连接以从两个表返回数据

如何在字节数组中反转UTF-8编码?

如何正确使用java.time类?

ExecutorService:如果我向Executor提交了太多任务,会发生什么?

在不带instanceof或switch的java中记录模式