对应于标题,我的问题是获取泛型数组的数组长度,该数组位于类的实例中,该类已使用此泛型类型初始化。 当我想得到我的数组的长度(ak.array.length)时,java会抛出这个错误:
线程“main”中的异常java.lang.ClassCastException:[Ljava.lang.Object;无法转换为[Ljava.lang.String; 在Testclass.main(Testclass.java:15)
那么我的代码在哪里? 提前致谢
public class Testclass {
static class ArrayKeeper<T> {
protected T[] array;
public ArrayKeeper() {
array = (T[])new Object[5];
}
}
public static void main(String[] args) {
//create a new instance of inner class ArrayKepper (type String)
Testclass.ArrayKeeper<String> ak = new Testclass.ArrayKeeper<String>();
System.out.println(ak.array.length); //cast error here.
}
}
答案 0 :(得分:4)
问题出在这一行:
array = (T[]) new Object[5];
这不是创建通用数组的方法,而是按照您的意图创建Object[]
而不是String[]
。您无法创建Object[]
然后将其转换为您想要的任何类型,您必须创建正确类的数组。试试这个:
public ArrayKeeper(Class<T> clazz, int size) {
array = (T[]) Array.newInstance(clazz, size);
}
然后,当您需要实例化ArrayKeeper
时:
Testclass.ArrayKeeper<String> ak =
new Testclass.ArrayKeeper<String>(String.class, 5);
答案 1 :(得分:2)
我认为您需要在length
中实施ArrayKeeper
getter,因为您无法将Object[]
强制转换为String[]
,并且调用ak.array
确实试图做那个演员。