gpt4 book ai didi

Java - 带有泛型的工厂和策略模式

转载 作者:行者123 更新时间:2023-11-29 08:33:27 24 4
gpt4 key购买 nike

我正在尝试使用泛型实现策略 + 工厂模式。目标是向客户端类返回接口(interface) DocumentDao 的实现,它可以处理类型 T 扩展 Document,因此我有多个 Dao 接口(interface)扩展 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;它不知 Prop 体是什么Class实例带回来。此外,您的类型绑定(bind)在您的方法中不正确且无效。

要解决此问题,您需要更改两件事:

  • 在你的DocumentDaoFactory方法,将绑定(bind)更改为适当的。

    <T extends Document> DocumentDao<T> getDaoInstance(Class<T> clazz);
  • 在您使用getDaoInstance ,对 Class<T> 执行未经检查的转换.

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

类型绑定(bind)的方式应该返回您关心的实例,而不会出现任何运行时错误。

关于Java - 带有泛型的工厂和策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45965773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com