用Java中的泛型进行组合和继承-确保类型并避免原始类型的正确方法

时间:2019-04-01 12:13:28

标签: java generics

Hello Stack社区,

请指导我,在避免遵循以下类型层次结构中未经检查的类型分配的同时,执行高效,优雅的泛型键入的最佳方法是什么(我在当前的示例输入解决方案中也包括了该示例,但我有一种感觉我在某处大规模失败...)

DAO操作的接口(在这里,通用类型是显而易见的,我认为是合理的解决方案):

interface DaoInterface<T> {
  T getData();
  T setData(T t);
}

用于管理的抽象Dao类(类和接口都具有相同的通用类型):

abstract class DaoAbstractBaseClass<T> implements DaoInterface<T> {
  /* mostly data and configuration handling, thus needed */
  /* DAO operations ensured due to class generic parameter */
}

实际实现(使用类型,以便能够推断和使用从Dao接口返回的类型):

class ConcreteDaoImplementation extends DaoAbstractBaseClass<ConcreteType>

现在有一些抽象服务类(包含Dao实例并使用它),将字段映射到Dao的最低级别的接口(因为我只对通过接口操作使用它感兴趣):

abstract class SomeServiceClass<T> {
  private DaoInterface<T> dao;
}

具体类型的服务(例如示例ConcreteType)的实际实现:

class RealService extends SomeServiceClass<ConcreteType> {
  /* Dao is now ConcreteType*/
}

现实生活中的实际DAO是由来自外部世界的依赖注入提供的。

我认为让我们感到困惑的是,将泛型移植到最底层的实现类中只是为了参数化顶层抽象接口。其次,我认为将abstract class DaoAbstractBaseClass<T> implements DaoInterface<T>构造为天真地生成类只是为了确保其接口实现的类型……有人可以指出可以增强的内容还是指出一些智能的外部材料吗?我将不胜感激!

编辑

如果有人发现UML有用,那么从正式的角度来看,以下是一种几乎是正确的:) Class Diagram for this issue

0 个答案:

没有答案