java中的ClassCast异常,无法强制转换为Ljava.lang.Integer

时间:2016-09-29 08:40:39

标签: java

我正在尝试使用java泛型 -

 public T[] toArray()
   {


      T[] result = (T[])new Object[numberOfEntries]; 

       // some code here to fill the resultarray



     return result;
   } // end toArray

现在在我的主要功能中,这就是我正在做的事情 -

        A<Integer> obj= new A<Integer> ();

        obj.add(1); //add method not shown here as it is not relevant to question
        obj.add(2);
        obj.add(3);
        obj.add(4);


        Integer arr[] = (Integer[]) obj.toArray();

我收到以下错误 -

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
    at tester.main(tester.java:14)

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

您正在尝试将Object[]类型的对象转换为Integer[]。这些是不兼容的类型,因此JVM会抛出ClassCastException。您需要向toArray提供一些运行时类型信息,例如:

public T[] toArray(Class<T> clazz)
{
  @SuppressWarnings("unchecked")
  T[] result = (T[])Array.newInstance(clazz, numberOfEntries);
  // some code here to fill the resultarray
  return result;
}

...

// and use it like this:
Integer arr[] = obj.toArray(Integer.class);

答案 1 :(得分:4)

由于类型擦除,toArray()方法将返回Object[]类型的数组,而不是Integer[],并且无法将Object[]强制转换为{{1} }}

如果要在运行时从泛型类返回Integer[]数组,可以尝试将实际的类类型作为参数传递给Integer方法:

toArray()

<强>用法:

public T[] toArray(Class<T> c, int size) {
    @SuppressWarnings("unchecked")
    final T[] result = (T[]) Array.newInstance(c, s);
    return result;
}

答案 2 :(得分:0)

你在代码T [] result =(T [])new Object [numberOfEntries]; 您需要将其替换为T [] result =(T [])new T [numberOfEntries];

答案 3 :(得分:0)

Object[]无法直接转发给Integer[]。使用下面的代码逐个移动元素:

    Object[] arr = new Object[SIZE];
    Integer[] arr1 = new Integer[arr.length];
    int i = 0;
    for(Object a:arr){
        arr1[i++] = (Integer)a;
    }