Java:实现一个通用方法,该方法实例化一个特定类型的集合

Java:实现一个通用方法,该方法实例化一个特定类型的集合,java,generics,collections,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.newInsta

我想实现一个通用方法,它执行类似于以下内容的操作:

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);
        }
    }
}
private void addToSize(ArrayList列表、类类型、int size){
int currentSize=list.size();
对于(int i=当前大小;i<大小;i++){
试一试{
list.add(type.newInstance());
}捕获(实例化异常e){
记录器错误(“,e);
}捕获(非法访问例外e){
记录器错误(“,e);
}
}
}
上述方法适用于以下情况:

ArrayList<Integer> test = new ArrayList<Integer>();
addToSize(test, Integer.class, 10);
ArrayList test=new ArrayList();
addToSize(test,Integer.class,10);
但我也希望它能为

ArrayList<ArrayList<Integer>> test = new ArrayList<ArrayList<Integer>>();
addToSize(test, ArrayList.class, 10); //Is this possible?
ArrayList test=new ArrayList();
addToSize(测试,ArrayList.class,10)//这可能吗?
这可能吗?

您可以使用:

公共接口工厂{
公共不创建();
}
私有静态void addToSize(ArrayList列表、Factory、int size){
int currentSize=list.size();
对于(int i=当前大小;i<大小;i++){
list.add(factory.create());
}
}
然后以您的示例(匿名实现)为例:

ArrayList。
create()
方法实现的复杂性是任意的。

您可以这样做

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

类文本总是用原始类型参数化的
Class
。将它放入一个用泛型参数化的
类中有点棘手。

否-您当前的签名不可能-没有
ArrayList.Class
。好主意,不过你知道array.fill()吗?如果您愿意让您的客户机生成一个类对象,为什么不让他们生成一个填充对象呢。这更一般。
ArrayList<ArrayList<Integer>> test2 = new ArrayList<ArrayList<Integer>>();
addToSize( test2, 
    new Factory<ArrayList<Integer>>() {
       public ArrayList<Integer> create() { 
           return new ArrayList<Integer>( );
       }
    }, 10 ); // compiles
ArrayList<ArrayList<Integer>> test = new ArrayList<ArrayList<Integer>>();
addToSize(test, (Class<ArrayList<Integer>>)(Class<?>)ArrayList.class, 10);