【发布时间】:2018-05-14 14:46:14
【问题描述】:
我最近才接触到 Java 泛型,想复制可用于数组的 JavaScript 映射函数。现在我无法弄清楚我的代码出了什么问题:
public class Test {
public interface Function<T> {
public T call(T... vals);
}
public <E> E[] map(E[] array, Function<E> func) {
for (int i = 0; i < array.length; i++) {
array[i] = func.call(array[i]); <--- Exception
}
return array;
}
public Test() {
Integer foo[] = {3, 3, 4, 9};
foo = map(foo, new Function<Integer>() {
@Override
public Integer call(Integer... vals) {
return vals[0] += 2;
}
});
for (Integer l : foo) {
System.out.println(l);
}
}
public static void main(String[] args) {
new Test();
}
}
我在指定行遇到 ClassCastException:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
我没有在任何地方将整数数组转换回对象数组,我无法真正弄清楚出了什么问题,因为在那一行中数组仍然是整数数组,它永远不会进入匿名方法。
对不起,如果这是一个我应该很容易找到解决方案的问题,我试过了,但没有找到。另外,如果您不赞成,请告诉我原因。
【问题讨论】:
-
为什么需要
T... vals? -
因为我希望能够多用途地使用它
-
简短回答,你不能创建通用数组,这就是为什么编译器创建一个
Object[]并尝试将其转换为Integer[]但数组不是多态的,因此ClassCastException -
你应该收到警告