Java8 创建泛型数组

By | 5月 29, 2016

问题描述

在使用泛型编程的时候,由于类型擦除导致无法在运行时创建一个泛型数组。

// Cannot compile thorough.
// Error: Cannot create a generic array of T.
T[] array = new T[5];

Java8之前的解决方法

传入一个数组,利用反射的方式填充该数组,或者通过它来创建一个新的数组。

List<String> strList = ...;
strList.toArray(new String[5]);

Java8的解决方法

使用Lambda表达式,传递一个数组构造器引用。Stream的toArray方法,就是通过数组构造器引用,返回指定类型的数组。

Stream<String> strStream = ...;
strStream.toArray(String[]::new);

实现分析

传入一个Lambda表达式:IntFunction<T[]>,输入参数为整数n,返回一个长度为n,数据类型为T的泛型数组。

Example:

public static <T> T[] createArray(IntFunction<T[]> function) {
  T[] array = function.apply(5);
  // Populate values to array
  return array;
}

List[] listArray1 = createArray(n -> new List[5]);
List[] listArray2 = createArray(List[]::new);

P.S. 数组构造器引用,就是一个普通方法引用,没有什么特别的。