Java惯用法创建通用数组的方法

时间:2014-04-16 02:22:07

标签: java arrays generics

编辑:这是上述问题的副本。原始问题涉及在编译时类型未知的列表。这个问题涉及像通用列表的构造一样的数组。  例如,final E[] a = (E[]) Array.newInstance(c, s);的上述解决方案将无效,因为我无法获取List<MyClass>.class而且您也无法从Object[]转换为List<MyClass>[]

处理类似泛型类型的数组的惯用方法是什么?例如,我想要一个List<MyClass>数组。 ArrayList<List<MyClass>> myClassArray无法直接使用,因为即使myClassArray.set(5, myClassObj)为0,我也需要能够执行myClassArray.size()之类的操作。使用

初始化它
for(int i = 0; i < mySize; i ++){
    myClassArray.add(null)
}

有效,但很难看。

List<MyClass> myClassArray[]无效,因为you can't create a generic array。那么实现目标的最惯用方法是什么?一旦创建,数组的大小就不会改变。

2 个答案:

答案 0 :(得分:2)

创建自己的类来模拟数组。

class Array<T> {
    final Object[] data;

    public Array(int size) {
        data = new Object[size];
    }

    public void set(int index, T datum) {
        data[index] = datum;
    }

    @SuppressWarnings("unchecked")
    public T get(int index) {
        return (T) data[index];
    }
}

由于您控制对底层数组的访问,因此您知道其中的元素都是T类型的。

答案 1 :(得分:0)

通常的方法是

List<MyClass>[] myClassArray = new List[size];

参数化类型数组的类型是“不安全”的原因非常模糊(因为当你将某些东西放入其中时,它应该在运行时检查它是组件类型的一个实例,但它实际上是不可能的检查参数化类型的参数)并且与您的目的无关。