2

对应标题,我的问题是获取一个泛型数组的数组长度,它在一个类的实例内部,该类的实例已经用这个泛型类型初始化。当我想获取我的数组的长度(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.
    }
}
4

2 回答 2

4

问题出在这一行:

array = (T[]) new Object[5];

这不是创建通用数组的方法,您创建的是Object[]a 而不是 a 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);
于 2012-05-22T16:37:59.903 回答
2

我认为您需要实现lengthgetter in ArrayKeeper,只是因为您不能将 anObject[]转换为 a String[],并且调用ak.array确实会尝试进行该转换。

于 2012-05-22T16:35:04.480 回答