通用阵列创建

Str*_*ies 8 java arrays generics

这是我正在使用的代码

public class aClass<T> {

    private T[] elements;

    public aClass(T[] elements) {
        this.elements = elements;
    }

    public void doSomething() {
        T[] newArray = (T[]) new Object[5];
        ...
    }

}
Run Code Online (Sandbox Code Playgroud)

我见过有人说创建像这样的数组是一个坏主意,因为它不是类型安全的.但是,每次我使用它,我都没有问题.何时创建这样的数组会导致问题?

谢谢

Gui*_*let 4

这是导致问题的示例:

public class Main {

    public static class List<E extends Number> {

        private E[] myE;

        public void hello(E e) {
            E[] newArray = (E[]) new Object[5];
            for (int i = 0; i < newArray.length; i++) {
                newArray[i] = e;
            }
            myE = newArray;
        }

    }

    public static <T> T[] createArray(int size) {
        return (T[]) new Object[size];
    }

    public static void main(String[] args) throws IOException {
        List<Integer> integers = new List<Integer>();
        integers.hello(5);
    }
}
Run Code Online (Sandbox Code Playgroud)

您的代码可以工作,因为当您声明通用参数时,<T>它是未绑定的,这意味着它扩展了Object. 当您将数组转换为时,(T[])您实际上正在转换为(Object[]),因为这是编译器可以做的最好的事情。现在,如果将数组保留在代码中,就不会有太多问题。但是,如果代码之外的人可以检索该数组并使用对象以外的类型实例化您的类,那么他将遇到 ClassCastException。