2014-10-31 88 views
0

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

对于所有的DAO我有一个接口女巫包含所有数据对象需要实现的声明。 (在我的情况下:IDataObject)
特定的DAO都由其自己的接口表示,扩展了所有DAO的基本接口。

基本接口:

public interface IDataObject { 

    public IDataId getId(); 

    public void write() throws MyDataWriteException; 

    public void validate() throws MyDataValidException; 
} 

一个扩展:

public interface IDataSample1 extends IDataObject { 

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

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

} 

要创建我想用抽象的使用抽象的工厂,像一个数据对象:

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); 
} 

和实施:

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; 
    } 

} 

我没有得到任何错误,到目前为止,但现在我想实现一个工厂生成器:

public class DataFactoryBuilder { 

    private DataFactoryBuilder() { 
    } 

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

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

    } 

} 

我收到以下错误(8号线):

T cannot be resolved to a variable 

和(第9行)

Type mismatch: cannot convert from DataSample1Fac to IDataFactory<T> 

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

+0

我尝试: 公共静态 IDataFactory getFactory(类类型){ 如果(T = = IDataSample1.class) return new DataSample1Fac(); 返回null; } 但我得到相同的错误 – canisLupusLupus 2014-10-31 10:07:27

+0

T只是一个关于类型的信息。这不是一个对象本身,所以你不能调用它的方法。 – kaos 2014-10-31 11:34:07

回答

0

我会重构你的DataFactoryBuilder到类似的东西:

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

这非常接近我所需要的,谢谢。 当我创建te fac时,出现以下错误: 无法从捕获#1中转换?将IDataObject扩展为IDataSample1 – canisLupusLupus 2014-11-03 17:02:04

+0

你是如何得到这个错误的?像这样的DataSample1Fac fac = DataFactoryBuilder.getFactory(IDataSample1.class);?您应该使用IDataFactory fac = DataFactoryBuilder.getFactory(IDataSample1。类); – kaos 2014-11-03 20:25:06

+0

这不是问题。当我调用fac.get()时,比我得到这个错误。 – canisLupusLupus 2014-11-04 09:57:18

0

我得到了以下解决方案:

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;

Type safety: Unchecked cast from DataSample1Fac to IDataFactory<T> 

我认为是没有问题的,我必须剿它