我所拥有的是超级课程
class Geometry{
}
和两个扩展它的类:
class ShapeOne extends Geometry{}
class ShapeTwo extends Geometry{}
我想要实现的是生成类型ShapeOne
或ShapeTwo
或任何其他Geometry
实例的对象的列表(从数据库中读取),但是动态将类型作为参数传递,
比如:
public ArrayList< Geometry Object > getList(/**passing typeof generated list**/){
// getting data from Database;
return new ArrayList<typeof generated list>();
}
so the call would be then like:
getList(ShapeTwo);
感谢您的帮助:))
答案 0 :(得分:3)
你做不到。由于type erasure,List<Geometry>
不是List<ShapeOne>
的超类。这里有更好的解释:Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?。
解决问题的一些替代方案:
List<ShapeOne>
或List<ShapeTwo>
或List<TheExpectedClass>
而不是List<Geometry>
。<T extends Geometry> List<T>
并传递Class<T> clazz
作为参数。可能您需要使用其他参数来识别从数据库恢复的数据是否属于Geometry
的特定子类。答案 1 :(得分:3)
您可以通过Class<T>
传递,如下所示:
public <T extends GeometryObject> List<T> getList(Class<T> itemClass) throws Exception {
List<T> res = new ArrayList<T>();
for (int i = 0 ; i != 10 ; i++) {
res.add(itemClass.newInstance());
}
return res;
}
注意:上面对newInstance
的调用假设该类具有无参数构造函数。