2013-05-07 107 views
0

我試圖創建一個「CRUD管理器」類,執行擴展我創建的抽象超類的對象的數據庫操作。抽象類是相當簡單:創建一個泛型類,其類型參數僅限於某個超類

public abstract class IndexedEntity() { 

    protected Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     if(id == null) 
     this.id = id; 
     else throw new UnsupportedOperationException 
     ("The ID cannot be changed once it was set."); 
    } 

} 

現在我有一對夫婦的擴展這個IndexedEntity類,這些類代表我的業務實體:CarCustomerLease

而不是創建一個CRUD經理每個業務實體,我想我會嘗試創建一個支持其公共超類的通用CRUD類。

如何創建一個泛型類,在構造時需要一個類型參數,並且該類型參數僅限於某些類型 - 那些從IndexedEntity繼承的類?

喜歡的東西:

public interface ICrudManager<IndexedEntity> { 

    public void add(IndexedEntity e); 

    public IndexedEntity get(long id); 

    public void update(IndexedEntity e); 

    public void delete(IndexedEntity e); 

    public List<IndexedEntity> getAll(); 

} 

是否有可能在Java中?或者,這個想法有什麼不對嗎?是否認爲這是一個可接受的設計選擇?

(我可能會放棄它的第一件事,明天,因爲它可能是太難以概括了很多的行爲,但此刻我很好奇它如何可以做到的。

回答

4

使用Bounded Type Parameters

public interface ICrudManager<T extends IndexedEntity> { 

    public void add(T e); 

    public IndexedEntity get(long id); 

    public void update(T e); 

    public void delete(T e); 

    public List<T> getAll(); 

} 

,你可以創建對象,如ICrudManager<Car> carManager = new CrudManagerImpl<Car>();

+0

對於泛型類和接口,在'public'之後不需要聲明''。只需使用'public interface ICrudManager {'。 – rgettman 2013-05-07 17:16:49

+0

謝謝@rgettman,已編輯帖子 – sanbhat 2013-05-07 17:35:42

+1

接口中聲明的方法自動爲「public」。在接口中聲明的變量自動爲'public static final'。 – 2013-05-07 18:24:17

1
public interface MyInterface<T extends MyClass> 
1

您可以將接口線改爲public <T> interface ICrudManager <T exdents IndexedEntity>這將如果您嘗試插入不匹配的類,則會導致編譯器錯誤。

如果你希望你的系統更加動態化,你可以使用一個初始化程序的抽象類來測試執行期間的類型。

public abstract <T> class { 
     { 
     if(!T instanceof IndexedEntity) 
      throw new TypeException() 
     } 
    } 
+0

您不能在泛型類型參數上使用'instanceof'。 – GriffeyDog 2013-05-07 15:14:49

相關問題