2014-02-21 179 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