Java泛型投射错误

时间:2012-05-22 16:33:45

标签: java generics classcastexception

对应于标题,我的问题是获取泛型数组的数组长度,该数组位于类的实例中,该类已使用此泛型类型初始化。 当我想得到我的数组的长度(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.
    }
}

2 个答案:

答案 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确实试图做那个演员。

相关问题