Java泛型-多次使用同一通配符

问题描述

| 我有一个使用泛型和有界通配符的类声明:
class Factory<T extends Logic<? extends Entity>,U extends DAO<? extends Entity>> 
{
}
基本上,它是一个通用工厂,它采用逻辑接口(T)并返回已配置的实现。为了实例化逻辑,我采用了一个合适的DAO类来实现DAO接口(U)。 逻辑和DAO的接口也是通用的,并且将要使用的实体类型作为其类型参数。但是,我想进一步限制它,以便DAO和Logic不仅具有扩展Entity的类型参数,而且使它们扩展相同的Entity。结果可能类似于:
class <X extends Entity> Factory<T extends Logic<X>,U extends DAO<X>> 
{
}
我可以使用Java泛型来实现吗?     

解决方法

是的,您很亲密。像这样做:
class Factory<X extends Entity,T extends Logic<X>,U extends DAO<X>> 
{
}
另类
class Factory<T extends Logic<?>,U extends DAO<?>> 
{
    // Here,the generic method parameter only requires X
    // to be the same bound at method invocation. However,// you will \"lose\" that information again when the 
    // Factory is returned.
    public static <X extends Entity,U extends DAO<X>> Factory<T,U> createFactory(T logic,U dao)
    {
        return new Factory<T,U>(logic,dao);
    }
}
    ,另一种方法可能是提供一个包装器(尽管这不是很优雅;)):
class Entity{}

interface Logic<T extends Entity> {}

interface DAO<T extends Entity> {}

interface DaoLogic<X extends Entity> {
  DAO<X> getDAO();
  Logic<X> getLogic();
}

class Factory<T extends DaoLogic<? extends Entity>> {}
    ,以下工作。 X是\“ common \”类型,其中Logic和DAO都将使用此类型。
public class Factory<X extends Entity,U extends DAO<X>>
{
}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...