java - 继承有界类型参数以限制类型

标签 java generics inheritance

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

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/

相关文章:

c++ - 将 shared_ptr 与多继承类一起使用

java - 为什么有必要在泛型通配符中读取和 super 写入的情况下进行扩展?

java - 无法从数据库获取数据

java - MYSQL连接: Access Denied

java - throws x extends Exception 方法签名

java - JPanel 的扩展类不显示 JPanel 的属性

java - 尝试在 TestNG 中使用 ExtentReports 生成测试报告时获取 NullPointerException

java - 如何在类中引用嵌套模板参数的嵌套类型?

java - 如何使用采用某些枚举类型实例的方法创建接口(interface)?

java - PHP 对 Java 风格的类泛型有答案吗?