使用抽象类的子类的对象填充泛型List

时间:2017-03-28 10:12:48

标签: java generics abstract-class

假设我们在内部有一个名为Figure的抽象类和一个静态方法addFigureaddFigure应使用用户指定类型的对象填充现有列表。

public abstract class AbstractFigure {

    public static <T extends AbstractFigure> void addFigure(List<T> list, Class<T> clazz, int n)
    {   
        for (int i = 0; i < n; i++) {

            try {

                T obj = clazz.newInstance();
                list.add(obj);

            } catch (InstantiationException ex) {
                ex.printStackTrace();
            } catch (IllegalAccessException ex) {
                ex.printStackTrace();
            }
        }
    }
}

然后我们有一个子类Square

public class Square extends AbstractFigure { 
}

调用如下:

public class GenericsProblem{

    public static void main(String[] args) {

        ArrayList<Square> arrayListSquare = new ArrayList<>();

        AbstractFigure.addFigure(arrayListSquare, Square.class, 12);
    }
}

代码正常工作,列表中填充了Squares,正如我所假设的那样。

现在,我想重新制作AbstractFigure,而不是在现有列表上工作,它会创建并返回一个,如:

public abstract class AbstractFigure {

    public static <T extends AbstractFigure> List<T> addFigure(Class<T> clazz, int n)
    {
        List<T> genList = new ArrayList<>();

        for (int i = 0; i < n; i++) {

            try {

                T obj = clazz.newInstance();
                genList.add(obj);

            } catch (InstantiationException ex) {
                ex.printStackTrace();
            } catch (IllegalAccessException ex) {
                ex.printStackTrace();
            }
        }
        return genList;
    }
}

这是否可能,如果是这样,我怎么能调用它?

1 个答案:

答案 0 :(得分:1)

是的,有可能。您只需将返回值分配给变量。

List<Square> arrayListSquare = addFigure(Square.class, 12);