2 回答
TA贡献1735条经验 获得超5个赞
最简洁的方法是简单地将Class对象传递给函数。此外,您似乎可以Function颠倒类型参数的顺序——第一个类型参数应该是输入类型,第二个应该是结果类型。这样的事情应该让你更接近你想要的:
public static <R, D> R[] map(Function<D, R> function, D[] array, Class<R> clazz) {
R[] result = (R[]) Array.newInstance(clazz, array.length);
// apply function to each variable and add return value to the result array
for( int i = 0; i < array.length; i++ ) {
result[i] = function.apply(array[i]);
}
return result;
}
(我还建议将类型参数的顺序颠倒到您的方法中,以与内置反射类(如Function.)保持一致。)
TA贡献1911条经验 获得超7个赞
您面临的问题与 Java 泛型类型擦除有关。由于所有泛型类型都在运行时被擦除,Java 必须进行权衡以保证类型安全。
泛型数组的问题在于 Java 无法保证类型安全,您可以在此处找到一个很好的示例。简而言之,不允许创建通用数组。
要保留大部分原始代码,您可以使用Object[]:
public static <D, R> Object[] map(Function<D, R> function, D[] array) {
List<R> list = new ArrayList<>();
for (int i = 0; i < array.length; i++) {
R r = function.apply(array[i]);
list.add(r);
}
return list.toArray(new Object[0]); // no generic array creation allowed!
}
但是,这就是为什么大多数人坚持使用列表的原因,因为在涉及泛型时使用它们更容易:
public static <D, R> List<R> map(Function<D, R> function, List<D> array) {
List<R> list = new ArrayList<>();
for (D d : array) {
list.add(function.apply(d));
}
return list;
}
这样做的好处是,当具体类型已知时,您仍然可以在之后将其转换为数组:
List<String> strings = List.of("Test1", "Test2");
String[] array = map(String::toLowerCase, strings).toArray(new String[0]);
添加回答
举报