问题描述
在使用泛型编程的时候,由于类型擦除导致无法在运行时创建一个泛型数组。
// 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. 数组构造器引用,就是一个普通方法引用,没有什么特别的。