首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有抽象工厂的数据访问对象模式,创建泛型类型

具有抽象工厂的数据访问对象模式,创建泛型类型
EN

Stack Overflow用户
提问于 2014-10-31 09:52:35
回答 2查看 383关注 0票数 0

我正在为android设备开发一个数据库应用程序。我需要做的第一件事就是创建数据访问层。为此,我想在抽象工厂中使用DAO模式。

对于所有DAO,我有一个接口,它包含所有数据对象都需要实现的声明。(在我的例子中: IDataObject)

特定的DAO都由自己的接口表示,扩展了所有DAO的基本接口。

基本接口:

代码语言:javascript
复制
public interface IDataObject {

  public IDataId getId();

  public void write() throws MyDataWriteException;

  public void validate() throws MyDataValidException;
}

A延期:

代码语言:javascript
复制
public interface IDataSample1 extends IDataObject {

  public void setNotice(String notice);
  public String getNotice();

  public void setDate(Date date);
  public Date getDate();

}

要创建数据对象,我希望使用抽象来使用抽象工厂,如下所示:

代码语言:javascript
复制
public interface IDataFactory<Template extends IDataObject> {

  public List<Template> getAll();

  public Template get(IDataId id);

  public List<Template> getList(DataAccessArgument arg);

  public List<Template> getList(List<DataAccessArgument> argList);
}

以及执行情况:

代码语言:javascript
复制
public class DataSample1Fac implements IDataFactory<IDataSample1> {

  public DataSample1Fac () {
  }

  public List<IDataSample1> getAll() {
    return null;
  }

  public IDataSample1 get(IDataId id) {
    return null;
  }

  public List<IDataSample1> getList(DataAccessArgument arg) {
    return null;
  }

  public List<IDataSample1> getList(List<DataAccessArgument> argList) {
    return null;
  }

}

到目前为止,我还没有发现任何错误,但是现在我想实现一个工厂构建器:

代码语言:javascript
复制
public class DataFactoryBuilder {

  private DataFactoryBuilder() {
  }

  public static<T extends IDataObject> IDataFactory<T> getFactory(){    

    if (T instanceof IDataSample1)
      return new DataSample1Fac();
    return null;

  }

}

我得到以下错误(第8行):

代码语言:javascript
复制
T cannot be resolved to a variable

和(第9行)

代码语言:javascript
复制
Type mismatch: cannot convert from DataSample1Fac to IDataFactory<T>

我不知道怎么解决这个问题,有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-31 11:35:23

我会把你的DataFactoryBuilder重构成这样:

代码语言:javascript
复制
class DataFactoryBuilder {

    private DataFactoryBuilder() {
    }

    public static IDataFactory<? extends IDataObject> getFactory(Class<? extends IDataObject> clazz){    

        if (IDataSample1.class.isAssignableFrom(clazz)) {
            return new DataSample1Fac();
        }
        return null;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2014-11-03 17:07:36

我得到了以下解决方案:

代码语言:javascript
复制
public static <T extends IDataObject> IDataFactory<T> getFactory(Class<T> type) {
    if (IDataSample1.class.isAssignableFrom(type)) {
      DataSample1Facfac = new DataSample1Fac();
      return (IDataFactory<T>) fac;
    }
}

但我收到一个警告:返回(IDataFactory) fac;

代码语言:javascript
复制
Type safety: Unchecked cast from DataSample1Fac to IDataFactory<T>

我认为这不是问题,我只是要压制它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26671736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档