我有一个带有泛型的抽象类,使用有界类型参数来限制这种类型:
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>
任何人都知道发生了什么?
答案 0 :(得分:1)
问题是不,request
类中的Request
属性类型为BigRequest
,而不是AbstractBigCreator
。
实际问题是您的BigRequest
接口正在扩展Request
接口,因此您继承了T getRequest()
方法的定义。在Request
中,T
类型的约束为Some
,BigRequest
也是如此。
最简单的解决方案是重新定义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
。