2014-02-21 180 views
0

我试图修改我的代码,以避免使用泛型的所有重复代码。java,generic和getAll

我有一个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类是不通用的;它不能被参数化 论据<>

我怎么instanciate我的T子类在这里?

诀窍是什么?

谢谢。

编辑:

为了解释更详细我的目标: 我有两个类SUbClassA和SubClassB延伸DBBaseClass。

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

起初,我在我所有的子类中创建了getAll ...所以,我现在要把这个getAll()放到DBBase类中。

如果我想让他们返回List,但我不知道如何告诉该方法“返回此列表的这种特定类别的子类”,这很容易。

+0

你想让DBBase类包含它自己的实例吗?这对我来说看起来很奇怪。请解释一下,就好像我们是9岁的孩子一样,你想达到什么目的。 –

回答

1

只能实例化一个形而下类别,但不能T,因为它仅仅是一个类型,而不是DBBaseClass,因为它是抽象的。

你可以做:

  • 定义扩展DBBaseClassSubDBBaseClass这样
  • 每个子类返回一个具体的实例如

    protected T create() { 
        return new SubDBBaseClass(); 
    } 
    
  • 创建一个工厂方法的具体类
  • 在您的DBBaseClass.getAll()方法中调用此方法,如

    T myTObject = create(); 
    

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

+0

感谢它的工作。实际上,我刚开始重新设计架构,当我开始我的项目时,我的OOP知识很差。因此,我很乐意为如何重新设计架构提供一些线索。我听说过工厂模式。不知道它是否会在这里工作。 – user2250466

+0

查看Martin Fowler撰写的优秀书籍“企业应用程序体系结构模式”,概述服务体系结构。 –

2

你想使DBBaseClass通用的,对于这样的声明是:

abstract class DBBaseClass<T extends DBBaseClass<?>> 
+0

在这里寻找更多关于泛型的信息:http://docs.oracle.com/javase/tutorial/java/generics/types.html – Flo

+0

已更新,以启用泛型扩展和固定抽象位置 – setec