我有一个带有泛型的抽象类,使用有界类型参数来限制此类型:
public abstract class AbstractCreator<T extends Request> {
....
}
然后我有来自 AbstractCreator 的多个子级,其中一个使用另一个有界类型参数,如下所示:
public abstract class AbstractBigCreator<U extends BigRequest> extends AbstractCreator<U> {
U request;
...
}
<小时/>
接口(interface)有界类型如下所示:
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>
有人知道发生了什么吗?
最佳答案
问题是 不 request
属性的类型是 Request
而不是 BigRequest
中的 >AbstractBigCreator
类。
实际问题是您的 BigRequest
接口(interface)扩展了 Request
接口(interface),因此您继承了 T getRequest()
的定义方法。在 Request
中,T
类型绑定(bind)到 Some
,在 BigRequest
中也是如此。
最简单的解决方案是重新定义BigRequest
接口(interface)中的T getRequest()
方法,这样 covariance应用于 getRequest
方法的返回类型。这意味着 BigRequest
接口(interface)的 getRequest
方法将返回 SomeOther
而不是 Some
。
只需这样做:
public interface BigRequest<T extends SomeOther> extends Request<T> {
@Override
T getRequest();
}
在 AbstractBigCreator
中调用 request.getRequest()
后,您将能够访问 SomeOther
。
关于java - 继承有界类型参数以限制类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44200908/