【发布时间】:2017-03-26 12:03:27
【问题描述】:
在 Java 中,我们可以从一维数组构造函数引用创建 IntFunction<String[]>:
// both do the same thing
IntFunction<String[]> createArrayL = size -> new String[size];
IntFunction<String[]> createArrayMR = String[]::new;
现在我想知道为什么我们不能用二维数组来做到这一点:
BiFunction<Integer, Integer, String[][]> createArray2DL =
(rows, cols) -> new String[rows][cols];
// error:
BiFunction<Integer, Integer, String[][]> createArray2DMR =
String[][]::new;
当然我们可以写:
IntFunction<String[][]> createArray2DInvalidL = String[][]::new;
System.out.println(createArray2DInvalidL.apply(3)[0]); // prints null
但这将与以下行为不同:
new String[3][3]
因为行数组不会被初始化。
所以我的问题是:为什么 String[][]::new 不适用于 2D 数组(对我来说,这看起来像是语言设计的不一致)?
【问题讨论】:
标签: java lambda java-8 language-lawyer method-reference