Java - 带有泛型的工厂和策略模式
Java - Factory and Strategy Patterns with Generics
我正在尝试使用泛型实现策略 + 工厂模式。目标是 return 给客户端 class 接口 DocumentDao 的实现,它可以处理类型 T extends Document,所以我有多个 Dao 接口扩展 DocumentDao 用于不同的 Document 子类型。
这是我的代码:
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>
如何处理这种情况?
我怎样才能得到类似的解决方案?
谢谢
问题是 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());
您的类型绑定方式应该返回您关心的实例,而不会出现任何运行时错误。
我正在尝试使用泛型实现策略 + 工厂模式。目标是 return 给客户端 class 接口 DocumentDao 的实现,它可以处理类型 T extends Document,所以我有多个 Dao 接口扩展 DocumentDao 用于不同的 Document 子类型。
这是我的代码:
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>
如何处理这种情况? 我怎样才能得到类似的解决方案?
谢谢
问题是 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());
您的类型绑定方式应该返回您关心的实例,而不会出现任何运行时错误。