java,泛型和getAll

时间:2014-02-21 10:27:02

标签: java generics

我正在尝试使用泛型修改我的代码以避免所有重复的代码。

我有一个类DBBaseClass,将由其他一些类扩展。我正在尝试创建一个getAll方法,它返回存储在数据库中的子类的所有对象。

 class abstract DBBaseClass {

  abstract readDataBase(int _id);

  public  <T extends DBBaseClass> List<T> getAll()
  {

 List<T> array = new ArrayList<T>();    

 ArrayList<Integer> myints = DBManager.request_database_for_ids(getIdField(), getTableName());

 T myTObject = new T();    // NOT WORKING  *************************

 for (int i=0;i<myints.size();i++) {        
        myTObject.read(myints.get(i));
        array.add(myTObject);
    }               

return array;

我有错误:      - 无法实例化类型T.      - T型不是通用的;它无法参数化      参数&lt;&gt;

我怎样才能在这里实现我的T子类?

诀窍是什么?

感谢。

编辑:

详细解释我的目标: 我有两个扩展DBBaseClass的类SUbClassA和SubClassB。

我想要一个方法: SubClassA.getAll()返回SUbClassA对象的arraylist。 SubClassB.getAll()返回SUbClassB对象的arraylist。

首先,我在所有子类中创建了getAll ...所以,我现在正尝试将此getAll()放在DBBaseclass中。

如果我希望它们返回List,但我不知道如何告诉方法“返回这个特定类型的子类列表”,这很容易。

2 个答案:

答案 0 :(得分:2)

你想让DBBaseClass成为通用的,因为它声明如下:

abstract class DBBaseClass<T extends DBBaseClass<?>>

答案 1 :(得分:1)

你只能实例化一个混凝土类而不是T,因为它只是一种类型而不是DBBaseClass,因为它是抽象的。

你能做什么:

  • 定义一个扩展DBBaseClass的具体类,例如SubDBBaseClass
  • 为每个返回具体实例(如

    )的子类创建工厂方法
    protected T create() {
        return new SubDBBaseClass();
    }
    
  • DBBaseClass.getAll()方法中调用此方法,例如

    T myTObject = create();
    

也许你不知道,但是你正在使用有起伏的active record pattern。我不喜欢这种模式,我会重新设计这个架构。但这些只是我5美分。