2016-06-10 53 views
-2

我有一個DAO對象,我通常與實體類名擴展,像這樣:擴展一個通用的實施者類

public class DAO<T> { 

    private final Class<T> clazz; 
    public DAO(Class<T> clazz { 
     this.clazz = clazz; 
    } 
} 

public class EntityDAO extends DAO<Entity> { 

    public EntityDAO() { 
     super(Entity.class); 
    } 
} 

不過,我有一些我想創建一個抽象的DAO抽象實體這被落實到具體的類以後:

public class DAO<T> { 

    private final Class<T> clazz; 
    public DAO(Class<T> clazz { 
     this.clazz = clazz; 
    } 
} 

public abstract class AbstractEntityDAO extends DAO<T extends AbstractEntity> { 

    public AbstractEntityDAO() { 
     super(AbstractEntity.class); 
    } 
} 

public abstract class EntityDAO extends AbstractEntityDAO <Entity> { 

    public EntityDAO() { 
     super(Entity.class); 
    } 
} 

但是,這並不工作,爲AbstractEntityDAO抱怨意想不到的束縛,它無法解決T.是否有可能做到這一點?如果是這樣,它是怎麼寫的?

這是用Java 1.7

回答

1

把泛型類型定義上AbstractEntityDAO

public abstract class AbstractEntityDAO<T extends AbstractEntity> extends DAO<T> { 
... 
} 

根據您當前的代碼AbstractEntityDAO <Entity>應該讓編譯器抱怨AbstractEntityDAO沒有通用paremeters。

除此之外,您的AbstractEntityDAO()構造函數也需要接受Class參數。但是,如果您始終使用具有具體類型的類的實例,則根本不需要將該類作爲參數傳遞。如果有EntityDAO中的具體定義,則使用反射類可以確定T的類型。內置的反射實用程序不提供簡單的方法來做到這一點,但幸運的是,您只需要一些額外的代碼來提供一個,看看這裏:http://www.artima.com/weblogs/viewpost.jsp?thread=208860

這基本上是我們正在做的。這裏是我們的方法的粗略的破損:

abstract class BaseDAO<T> { 
    Class<?> entityClass; 

    BaseDAO() { 
    //this is based on the link I posted above but basically uses the actual concrete class 
    //(subclass determined by getClass()) to extract the generic types and 
    //since we only have one we get the first one from the returned list 
    entityClass = ReflectionHelper.getTypes(getClass(), BaseDAO.class).get(0); 
    } 

    public T getEntity(Object id) { 
    ... 
    } 
} 

abstract class TranslatableDAO<T extends TranslatableEntity> extends BaseDAO<T> { 
... 
} 

//Users are not translatable 
class UserDAO extends BaseDAO<User> { 
... 
} 

//Products are translatable, i.e. Product extends TranslatableEntity 
class ProductDAO extends TranslatableDAO<Product> { 
... 
} 
+0

謝謝你,我知道我錯過了一些東西! – Draken