【问题标题】:Java - Factory and Strategy Patterns with GenericsJava - 具有泛型的工厂和策略模式
【发布时间】:2017-08-30 16:45:13
【问题描述】:

我正在尝试使用泛型实现策略 + 工厂模式。目标是向客户端类返回一个可以处理类型 T 扩展 Document 的接口 DocumentDao 的实现,因此我有多个 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>

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

谢谢

【问题讨论】:

    标签: java generics design-patterns factory-pattern strategy-pattern


    【解决方案1】:

    问题是getClass 正在返回一个Class&lt;?&gt;,它适用于API;它不知道要带回什么具体的Class 实例。此外,您的类型绑定在您的方法中不正确且无效。

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

    • 在您的DocumentDaoFactory 方法中,将绑定更改为适当的。

      <T extends Document> DocumentDao<T> getDaoInstance(Class<T> clazz);
      
    • 在您使用getDaoInstance 时,对Class&lt;T&gt; 执行未经检查的强制转换。

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

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

    【讨论】:

    • 抱歉第一个错误,这只是一个疏忽(在我的真实代码中它是正确的),所以我会更新这个问题。第二点解决了我的问题,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2016-12-26
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多