繁体   English   中英

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

[英]Java generics - use same wildcard multiple times

我有一个使用泛型和有界通配符的类声明:

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,
                   T extends Logic<X>, 
                   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是“公共”类型,其中Logic和DAO都将使用此类型。

public class Factory<X extends Entity, T extends Logic<X>, U extends DAO<X>>
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM