我想在这里这样做,它实际上有效,但不知何故我不认为这是一个好的解决方案:
class A5<T> implements A4<T> {
private final T[] elements;
A5(T... elements) {
this.elements = elements;
}
public <R> A5<R> map(Function<T, R> function) {
List<R> liste = new LinkedList<>();
for (T element : elements) {
liste.add(function.apply(element));
}
Object[] objects = new Object[liste.size()];
int counter = 0;
for (R element : liste) {
objects[counter] = liste.get(counter++);
}
return new A5(objects);
}
}
对我来说,Object[]
是一个问题,但我无法创建 R[]
数组。有人有解决办法吗?更改 CTOR 和 map 签名不是我想要的。只能改变 body 。
最佳答案
您无法创建通用数组,因此除非您更改 T[]
到 List<T>
上课A5
您需要创建一个 Object[]
。
不过你的代码可以简化一点。您可以使用 Java 8 Stream 来映射元素并将它们收集到 Object[]
然后转换此 Object[]
到R[]
。 @SuppressWarnings("unchecked")
隐藏未经检查的强制转换产生的警告:
class A5<T> implements A4<T> {
private final T[] elements;
A5(T... elements) {
this.elements = elements;
}
@SuppressWarnings("unchecked")
public <R> A5<R> map(Function<T, R> function) {
return new A5<>((R[]) Arrays.stream(elements).map(function).toArray());
}
}
关于Java:通用方法 - 将元素添加到 vararg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38329548/