【问题标题】:Trouble with casting array of objects back to an array of integers将对象数组转换回整数数组时遇到问题
【发布时间】: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&lt;R&gt; 而不是R[] - 它只是看起来更干净。
  • 我用我自己的函数(它只返回参数)运行代码,它运行良好。 intellij 12 - jdk1.7.0_21
  • 问题可能出在CalculateSuccessor 的定义中——也许这会以某种方式限制R

标签: java arrays classcastexception


【解决方案1】:

问题是结果数组被创建为新对象[array.length]。强制转换 (R[]) 不会将此数组转换为不同的类型,它只是告诉编译器将其视为 R[]。见Quick Java question: Casting an array of Objects into an array of my intended class。创建一个泛型类型的数组有点讨厌 - 你可以谷歌搜索各种解决方案,例如How to create a generic array in Java? - 但通常最简单的方法是使用列表而不是数组:您可以使用 new ArrayList

创建它

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 2016-07-11
    • 2010-10-22
    • 1970-01-01
    • 2015-07-03
    • 2019-11-03
    • 2020-07-31
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多