Java中T[]::new是数组构造器引用,用于动态创建指定长度数组,常见于Stream.toArray()等需延迟构造数组的场景,本质是IntFunction<T[]>的简洁实现。
![java 中方法引用怎么使用“数组类型[]::new”快捷创建指定长度的数组](https://img.php.cn/upload/article/001/242/473/178467140759700.jpeg)
Java 中用 数组类型[]::new 是一种方法引用写法,本质是将“创建指定长度数组”这个动作封装为一个函数式接口(如 IntFunction<t></t> 或更通用的 Function<integer t></integer>)的实现,常用于 Stream 的 toArray() 或其他需要动态构造数组的场景。
什么时候会用到 T[]::new
主要出现在需要延迟/按需创建数组的地方,尤其是配合函数式接口使用:
- Stream 的
toArray(IntFunction<a> generator)</a>方法(Java 8+) - 自定义函数接口中需要返回数组时,作为简洁实现
- 替代手动写 lambda 表达式
size -> new String[size]
String[]::new 的典型用法
最常见的是在 Stream 转数组时避免类型擦除问题:
List<String> list = Arrays.asList("a", "b", "c");
String[] arr = list.stream().toArray(String[]::new); // ✅ 正确
等价于:
立即学习“Java免费学习笔记(深入)”;
list.stream().toArray(size -> new String[size]);
注意:不能写成 new String[]::new 或 String[].class::newInstance —— 语法错误,必须是 数组类型[]::new,JVM 会将其解析为接受一个 int 参数并返回对应长度数组的构造器引用。
支持的数组类型和限制
所有合法的数组类型都支持,包括:
- 引用类型:
String[]::new、List[]::new、MyClass[]::new - 基本类型:
int[]::new、byte[]::new、boolean[]::new(注意不是Integer[]::new)
但不支持泛型数组(如 List<String>[]::new),因为 Java 不允许创建具体参数化类型的数组;也不支持多维数组字面量写法(int[][]::new 是合法的,但它创建的是 int[][],参数是第一维长度,内部元素为 null 或默认值)。
自定义场景中的使用示例
比如定义一个工具方法接收数组构造器:
public static <T> T[] createArray(IntFunction<T[]> constructor, int length) {
return constructor.apply(length);
}
// 使用
String[] strs = createArray(String[]::new, 5); // 创建长度为 5 的 String[],元素全为 null
int[] ints = createArray(int[]::new, 3); // 创建 [0, 0, 0]
这里 String[]::new 就是实现了 IntFunction<String[]> 接口的实例,JVM 自动将其绑定到数组的“带 int 参数的隐式构造器”。


















