【发布时间】:2013-10-03 03:21:01
【问题描述】:
当我运行它时,我得到了错误:
线程“main”中的异常 java.lang.ClassCastException: [Ljava.lang.Object;不能转换为 [Ljava.lang.Integer;在 Main.main(Main.java:30)
public class Main
{
private interface Function<R, D>
{
public R apply(D parameter);
}
public static void main(String[] args)
{
// Example 1
Function<Integer, Integer> function = new CalculateSuccessor();
Integer[] integerArray = {1, 3, 4, 2, 5};
PrintArray(map(function, integerArray)); // map returns {2, 4, 5, 3, 6} <--- line 30
}
@SuppressWarnings({"unchecked"})
public static <R, D> R[] map(Function<R, D> function, D[] array)
{
R[] results = (R[]) new Object[array.length];
// Iterate through the source array, apply the given function, and record results
for (int i = 0; i < array.length; i++)
{
results[i] = (R)function.apply(array[i]);
}
return results;
}
public static <T> void PrintArray(T[] array)
{
for (T element : array)
{
System.out.println(element.toString());
}
}
}
【问题讨论】:
-
大概第30行是
R[] results = (R[]) new Object[array.length];? -
第 30 行是我调用 PrintArray 方法的时候。我很抱歉没有说明这一点。
-
我的猜测是
R被解析为Object,而不是您所期望的Integer。老实说,数组和泛型通常不能很好地结合在一起。如果我必须写这个,我会让map返回一个List<R>而不是R[]- 它只是看起来更干净。 -
我用我自己的函数(它只返回参数)运行代码,它运行良好。 intellij 12 - jdk1.7.0_21
-
问题可能出在
CalculateSuccessor的定义中——也许这会以某种方式限制R。
标签: java arrays classcastexception