1

我试图使用泛型实现Strategy + Factory模式。我们的目标是返回一个客户端类的接口DocumentDao的实现,它可以处理类型T extends Document,所以我有多个Dao接口为DocumentDao的不同子类型扩展DocumentDao。Java - 带泛型的工厂和战略模式

这里是我的代码:

public class Document { ... } 

public class DocumentA extends Document { ... } 

public class DocumentB extends Document { ... } 

public interface DocumentDao<T extends Document> { 
    public void update(T document); 
} 

public interface DocumentADao<DocumentA> {} 

public interface DocumentDaoFactory { 
    public <T extends Document> DocumentDao<T> getDaoInstance(Class<T> clazz); 
} 

然后我尝试使用工厂:

private <T extends Document> void someMethod(T document) { 
    ... 
    DocumentDao<T> documentDao = this.documentDaoFactory.getDaoInstance(document.getClass()); 
    documentDao.update(document); 
    ... 
} 

但有关getDaoInstance()调用编译器的抱怨:

Type mismatch: cannot convert from DocumentDao<? extends AbstractGDriveDocument<?>> to DocumentDao<T> 

如何处理这种情况? 我如何获得类似的解决方案?

由于

回答

4

的问题是,getClass是返回Class<?>,这是适当的API;它不知道具体哪个具体的Class实例带回来。此外,您的类型绑定在您的方法中不正确且无效。

为了解决这个问题,你需要改变两两件事:

  • 在你DocumentDaoFactory方法,改变必然是适当的。

    <T extends Document> DocumentDao<T> getDaoInstance(Class<T> clazz); 
    
  • 在你使用的getDaoInstance,执行未经检查的强制转换为Class<T>

    DocumentDao<T> documentDao = this.documentDaoFactory.getDaoInstance((Class<T>) document.getClass()); 
    

你的类型是绑定应该给你回你所关心的情况下,没有得到任何运行时错误的方式。

+0

对不起,第一个错误,这只是一个疏忽(在我的真实代码中是正确的),所以我会更新这个问题。 第二点解决了我的问题,非常感谢。 – user1781028