Вы можете использовать Array.newInstance
так:
public static <T> T[][] createArrays(Class<T> clazz, T... items) {
Stream<Stream<T>> streams = EnumPerm.of(items);
return streams
.map(s -> s.toArray(len -> (T[])Array.newInstance(clazz, len)))
.toArray(len -> (T[][])Array.newInstance(items.getClass(), len));
}
без каких-либо промежуточных List
с.
Существует вариант для создания массивов одного типа без неконтролируемых приведений, например,
public static <T> T[][] createArrays(Class<T> clazz, T... items) {
Stream<Stream<T>> streams = EnumPerm.of(items);
T[] template = Arrays.copyOf(items, 0);
return streams
.map(s -> s.toArray(len -> Arrays.copyOf(template, len)))
.toArray(len -> (T[][])Array.newInstance(template.getClass(), len));
}
но поскольку не существует существующего массива типа T[][]
, мы не можем избежать Array.newInstance
для создания внешнего массива. Но обратите внимание, что для этого не требуется параметр clazz
.
Если вы хотите принудительно использовать указанный параметр clazz
для всех массивов, вы можете использовать
public static <T> T[][] createArrays(Class<T> clazz, T... items) {
Stream<Stream<T>> streams = EnumPerm.of(items);
return streams
.map(s -> s.toArray(len -> (T[])Array.newInstance(clazz, len)))
.toArray(len -> (T[][])Array.newInstance(clazz, len, 0));
}