Java:泛型类中的数组的奇怪问题

时间:2016-02-05 02:58:28

标签: java

我可以这样做:

public class className {
public static void main(String[] args){

    Storage<Book> bookstorage = new Storage<Book>(100);

}

public class Storage<E> implements GenStorage<E>{

private int size;
private E [] array = (E[]) new Object[100];

public Hylle(int size){
    this.size = size;
    for (int i = 0; i<size; i++){
        array[i] = null;
    }
}

虽然这给了我一个ArrayIndexOutOfBoundsException:

public class Storage<E> implements GenStorage<E>{

private int size;
private E [] array = (E[]) new Object[size];

public Hylle(int size){
    this.size = size;
    for (int i = 0; i<size; i++){
        array[i] = null;
    }
}

当数组的大小等于或大于对象的设置大小时,程序运行。为什么会发生这种情况,我该如何解决?提前谢谢。

编辑:修正了,我只需要这样做:

public class Storage<E> implements GenStorage<E>{

private int size;
private E [] array;

public Hylle(int size){
    this.size = size;
    array = (E[]) new Object[size];
    for (int i = 0; i<size; i++){
        array[i] = null;
    }
}

3 个答案:

答案 0 :(得分:2)

字段初始值设定项在构造函数体之前执行。在你的第二个例子中:

private int size;
private E [] array = (E[]) new Object[size];

创建一个大小为0的数组,因为这是int的默认值。然后:

for (int i = 0; i < size; i++){
    array[i] = null;
}

将尝试索引大小为0的数组,从而导致ArrayIndexOutOfBoundsException

第二个示例有效,因为您明确地将其大小设置为100.因此,传递给构造函数的大小实际上从未用于在两个示例中初始化数组。

答案 1 :(得分:0)

Array Object不会自动扩展其大小。这就是他们引入ArrayList的原因,其中数组的大小发生了变化。我可能会建议你尝试使用ArrayList来避免这个问题。

答案 2 :(得分:0)

因为您正在构造函数外部初始化成员变量。这种初始化发生在超级构造函数之间和当前类的构造函数之前。这意味着你的构造函数是这样的:

public Hylle(int size){
    // super constructor
    super();
    // out constructor initialization
    this.size = 0;
    this.array = (E[]) new Object[size]; // which is 0
    // this constructor
    this.size = size;
    for (int i = 0; i<size; i++){
        array[i] = null;
    }
}

很容易看到数组是用0大小创建的。