调整泛型类型数组的方法

时间:2014-02-08 15:48:08

标签: java arrays generics

我正在尝试为数组创建Resize方法,并且必须使用通用数组。我有如下构造函数:

public ArrayLists (Class <T[]> a) { 
    array = (T[])Array.newInstance(a, DEFAULT_SIZE);
}

然后,如果最终用户想要调整数组大小以增强或减少它,我有Resize方法,我想在其中创建一个传入大小的新temp数组并具有旧数组点到了临时我无法弄清楚如何创建临时数组。到目前为止,我有:

public void Resize (double tempSize) {
    //create the temp array of size tempSize  
    System.arraycopy(array, 0, temp, 0, size);
    array = temp;
}//end resize

我尝试过类似于我在构造函数中使用Array.newInstance的内容,但我只能通过使用Class<T[]>的另一个参数来实现这一点,然后我就无法重新分配{{1}到array。而且我不能只创建一个泛型类型的数组,因为java不喜欢它。

这可能会有点容易,但我的主要问题是在测试时我需要创建至少2种不同类型的数组来测试...例如

temp

然后以ArrayLists<String> list = new ArrayLists<>(String[].class); ArrayLists<Random> list1 = new ArrayLists<>(Random[].class); 为例。有什么建议??

编辑问题

我现在遇到调整resize方法的问题。我创建了2个数组:

list.Resize(20);

并且还有这个默认构造函数:

ArrayLists<String> list = new ArrayLists<>(String[].class);
ArrayLists<Random> list1 = new ArrayLists<>(Random[].class);

(我认为)应该足以初始化默认大小为“10”的数组。但每当我测试它时,它会向我显示list和list1的原始大小为0并且不会让我调整大小。我错过了什么?

1 个答案:

答案 0 :(得分:2)

首先,您应该传递Class<T>,而不是Class<T[]>。该方法将创建一个数组T[][]。因此,将构造函数更改为:

public ArrayLists (Class <T> a) { 
    array = (T[])Array.newInstance(a, DEFAULT_SIZE);
}

并传递String.class而不是String[].class

现在,您可以使用Class#getComponentType()方法解决您遇到的问题。这将为您提供数组的组件类型Class<T>

// Why the type of tempSize is double? It should be `int`
public void resize (int tempSize) {
    //create the temp array of size tempSize  
    T[] temp = (T[]) Array.newInstance(array.getClass().getComponentType(), 
                                       tempSize);
    System.arraycopy(array, 0, temp, 0, tempSize);
    array = temp;
}