我可以在不知道它是哪个子类的情况下创建子类的列表吗?

时间:2014-03-27 17:46:14

标签: java generics subclass

我想做这样的事情:

public List<?> queryProducts (String type) {
    Product p = Product.getProductByType(type);
    List response = null;
    if (p instanceof Dishwasher)
        response = new ArrayList<Dishwasher>();
    if (p instanceof Refrigerator)
        response = new ArrayList<Refrigerator>();
    // ...and so on

    return response;
}

如何在不经过每个子类的情况下完成此操作?有这样的事吗?

List<classOf(p)> response = new ArrayList<classOf(p)>();

3 个答案:

答案 0 :(得分:3)

不接受String类型,而是接受带有泛型类型参数的Class参数。

public <P extends Product> List<P> queryProducts (Class<P> clazz) {

    List<P> response = new ArrayList<P>();
    ...
    return response;
}

来电者可以执行

Product p = Product.getProductByType(type);

获取对象,然后调用getClass()传递必要的Class

答案 1 :(得分:2)

只需创建:

List<Product> response = new ArrayList<Product>();

并在那里添加项目以保持抽象

答案 2 :(得分:1)

如果您想以类型安全的方式执行此操作,则必须使用Class参数而不是String

E.g。

public <T extends Product> List<T> queryProducts (Class<T> type) {
    Product p = Product.getProductByType(type); // needs change
    List response = new ArrayList<T>()
    ...    
    return response;
}

然后您可以这样调用方法:

List<Refrigerator> list = queryProducts(Refrigerator.class);