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

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