如何将新实例添加到通用列表?

时间:2014-07-18 15:48:49

标签: java generics

有一个程序可以处理许多类型的列表(人物,猫,椅子等......)。

以下代码在代码中多次出现。代码使用类型Cat的实例填充给定列表,直到列表具有给定数量的实例。

int howMany = max - cats.size(); 
for(int i = 0; i < howMany; ++i) { 
 cats.add(new Cat()); 
} 

由于此代码出现很多次,我们想要创建一个替换它的方法。该方法将接受我们要添加实例的Listmax个实例。如果需要,它可以接受更多参数。

这一开始看起来很简单,但后来我记得由于类型擦除而无法编写new T()

还有什么方法可以达到这个目的?

2 个答案:

答案 0 :(得分:4)

您可以重用一个实例化给定类型T的类的方法。

public T getInstanceOfT(Class<T> aClass) {
   return aClass.newInstance();
}

然后,您可以实现一个方法,该方法使用List<T>类型的n对象填充给定的T

public <T> void populateList(List<T> list, Class<T> clazz, int n) {
    for (int i = 0; i < n; i++) {
        list.add(getInstanceOfT(clazz));
    }
} 

注1 :您必须处理IllegalAccessExceptionInstatiationException

Note2 :如果您不想使用getInstanceOfT(),则可以在添加到列表时执行clazz.newInstance()

您可以按如下方式使用该方法:

int howMany = max - cats.size(); 
Class<Cat> catClass = Cat.class;
List<Cat> listOfCats = new ArrayList<Cat>();
populateList(listOfCats, Cats.class, howMany);

更多信息:

答案 1 :(得分:0)

不是将所有不必要的对象添加到列表中,而是不能将较短的列表包装在使它们看起来更长的对象中?

class PaddedList<T> extends AbstractList<T> implements List<T> {

    private final List<T> wrappedList;
    private final int size;
    private final T padding;

    public PaddedList(List<T> wrap, int size, T pad) {
        this.wrappedList = wrap;
        this.size = size;
        this.padding = pad;
    }

    @Override
    public T get(int index) {
        return index < wrappedList.size() ? wrappedList.get(index) : padding;
    }

    @Override
    public int size() {
        return size;
    }

}

public void test() {
    List<String> test = Arrays.asList("One", "Two");
    List<String> list10 = new PaddedList<>(test, 10, "Many");
    System.out.println(list10);
}

打印

[One, Two, Many, Many, Many, Many, Many, Many, Many, Many]

显然,如果你试图修改任何用作填充的对象,那么这将是非常错误的,但如果你想要的只是你的列表看起来像是固定长度那么这将非常有效。