Java:实现一个实例化特定类型集合的泛型方法

时间:2012-08-06 02:05:21

标签: java generics collections

我想实现一个类似于以下内容的通用方法:

private <T> void addToSize(ArrayList<T> list, Class<T> type, int size) {
    int currentSize = list.size();

    for(int i = currentSize; i < size; i++) {
        try {
            list.add(type.newInstance());
        } catch (InstantiationException e) {
            logger.error("", e);
        } catch (IllegalAccessException e) {
            logger.error("", e);
        }
    }
}

上述方法适用于:

ArrayList<Integer> test = new ArrayList<Integer>();
addToSize(test, Integer.class, 10);

但我也希望它适用于......

ArrayList<ArrayList<Integer>> test = new ArrayList<ArrayList<Integer>>();
addToSize(test, ArrayList.class, 10); //Is this possible?

这可能吗?

2 个答案:

答案 0 :(得分:6)

您可以使用factory pattern

public interface Factory<T> {
    public T create();
}

private static <T> void addToSize( ArrayList<T> list, Factory<T> factory, int size ) {
    int currentSize = list.size();

    for ( int i = currentSize; i < size; i++ ) {
        list.add( factory.create() );
    }
}

然后为您的示例(匿名实施):

ArrayList<ArrayList<Integer>> test2 = new ArrayList<ArrayList<Integer>>();
addToSize( test2, 
    new Factory<ArrayList<Integer>>() {
       public ArrayList<Integer> create() { 
           return new ArrayList<Integer>( );
       }
    }, 10 ); // compiles

关于这个很酷的事情是类不需要默认构造函数,你可以将值传递给它的构造函数和/或使用builder patterncreate()方法实现的复杂性是任意的。

答案 1 :(得分:0)

你可以这样做

ArrayList<ArrayList<Integer>> test = new ArrayList<ArrayList<Integer>>();
addToSize(test, (Class<ArrayList<Integer>>)(Class<?>)ArrayList.class, 10);

类文字始终使用原始类型进行Class参数化。将它变成参数化的Class有点棘手。