我正在尝试使用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)
我该如何解决这个问题?
答案 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;
}