有界类型参数中对有限类型的继承

时间:2017-05-26 11:50:22

标签: java generics inheritance

我有一个带有泛型的抽象类,使用有界类型参数来限制这种类型:

public abstract class AbstractCreator<T extends Request> {
     ....
}

然后我有来自AbstractCreator的多个孩子,一个使用另一个有界类型参数,如下一个:

public abstract class AbstractBigCreator<U extends BigRequest> extends AbstractCreator<U> {
    U request;
    ...
}

接口有界类型如下:

public interface Request<T extends Some> {
     T getRequest();
}
public interface BigRequest<T extends SomeOther> extends Request<T> {

}

我的问题是这个带有另一个有界类型参数的子节点限制了它本身的父类有界类型参数而不是这个类型参数。因此,如果我从getRequest()调用方法U request,我会认为它是<T extends Some>而不是<T extends SomeOther>

我期待:

U request;
request.getRequest(); //Class <T extends SomeOther>

但我得到了:

U request;
request.getRequest(); //Class <T extends Some>

任何人都知道发生了什么?

1 个答案:

答案 0 :(得分:1)

问题是request类中的Request属性类型为BigRequest,而不是AbstractBigCreator

实际问题是您的BigRequest接口正在扩展Request接口,因此您继承了T getRequest()方法的定义。在Request中,T类型的约束为SomeBigRequest也是如此。

最简单的解决方案是重新定义T getRequest()接口中的BigRequest方法,以便将covariance应用于getRequest方法的返回类型。这意味着getRequest界面的BigRequest方法将返回SomeOther而不是Some

这样做:

public interface BigRequest<T extends SomeOther> extends Request<T> {

    @Override
    T getRequest();
}

SomeOther中致电request.getRequest()后,您就可以访问AbstractBigCreator