2014-12-04 50 views
1

动态类型的数组列表我有什么是超一流的生成Java

class Geometry{ 
} 

和两个类,扩展它:

class ShapeOne extends Geometry{} 

class ShapeTwo extends Geometry{} 

我想要实现的是生成一个列表(从数据库中读取)类型为ShapeOneShapeTwo的对象或任何其他为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); 

感谢您的帮助:)

回答

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; 
} 

Demo.

注:以newInstance上面的调用假定类有一个参数的构造函数。

+0

好的,比我的类应该有一个静态的newInstance(),对吧? – user1908375 2014-12-04 19:50:29

+0

@ user1908375'类'已经提供['的newInstance()'](http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#newInstance%28%29)方法。你确实需要一个无参数的构造函数才能工作。 – dasblinkenlight 2014-12-04 19:52:25

+0

...只有当类具有公共默认(无参数)构造函数时。 – mike 2014-12-04 19:53:13

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的特定子类。
+0

谢谢,我会尽力做到这一点。 – user1908375 2014-12-04 19:46:36