龙空技术网

java 核心技术-12版 卷Ⅰ- 6.2.5 构造器引用

CC躺平混吃 311

前言:

眼前大家对“构造器与方法的区别是什么”大致比较关注,朋友们都想要分析一些“构造器与方法的区别是什么”的相关文章。那么小编也在网摘上网罗了一些关于“构造器与方法的区别是什么””的相关文章,希望小伙伴们能喜欢,小伙伴们快快来学习一下吧!

原文6.2.5 构造器引用

构造器引用与方法引用很类似,只不过方法名为new。例如,Person::new是 Person 构造器的一个引用。哪一个构造器呢?这取决于上下文。假设你有一个字符串列表。可以在各个字符串上调用构造器,把这个字符串列表转换为一个 Person 对象数组,调用如下:

ArrayList<String> names = ... ;

Stream<Person> stream = names.stream().map(Person::new);

List<Person> people = stream.toList();

我们将在卷2的第1章讨论 stream、map和 toList 方法的详细内容。就现在来说,重点是map方法会为各个列表元素调用 Person(String)构造器。如果有多个 Person 构造器,编译器会选择有一个 String 参数的构造器,因为它从上下文推导出这是在调用带一个字符串的构造器可以用数组类型建立构造器引用。例如,int[]::new是一个构造器引用,它有一个参数数组的长度。这等价于lambda 表达式x->new int[x]。

第8章中将会看到,Java 有一个限制: 无法构造泛型类型T的数组。数组构造器引用对于克服这个限制很有用。(表达式 new T[n] 会产生错误,因为这会”擦除“为 new Object[n])。对于开发类库的人来说,这是一个问题。例如,假设我们需要一个 Person 对象数组。Stream 接口有一个 toArray 方法可以返回 Object 数组:

Object[] people = stream.toArray();

不过,这并不让人满意。用户希望得到一个 Person引用数组,而不是 Object 引用数组。流库利用构造器引用解决了这个问题。可以把 Person[]::new 传人 toArray 方法:

Person[] people = stream.toArray(Person[]::new);

toArray 方法调用这个构造器来得到一个有正确类型的数组。然后填充并返回这个数组

标签: #构造器与方法的区别是什么