我想做这样的事情:
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)>();
答案 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);