java - 无参数方法的多重继承

标签 java generics

Java 泛型可以帮助强制不带参数的方法返回扩展 A 并实现 B 的对象吗?

这是我目前拥有的:

public abstract class UI {
    public abstract MainPage getMainPage();

    public void refresh() {
        MainPage mainPage = getMainPage();
        if ( ! (mainPage instanceof AbstractLayout)) {
            throw new ClassCastException("Please subclass AbstractLayout");
        }
        // do stuff with mainPage
    }
}

public class MyUI extends UI {
    @Override
    public MainPage getMainPage() {
        return new MyPage();  // wrong: does not subclass AbstractLayout
    }
}

public class MyPage implements MainPage {}

public class AbstractLayout {}

public interface MainPage {}

我希望删除 getMainPage() 以某种方式强制其重写返回 AbstractLayout 的实例。现在,我正在运行时检查这一点,但我想在编译时进行此操作。可以吗?

最佳答案

是的,您可以使用泛型强制 getMainPage 的返回类型扩展 AbstractLayout 并实现 MainPage,而无需让 AbstractLayout 实现 MainPage。一种解决方案是使 UI 变得通用。

这将导致编译器错误:

public abstract class UI<T extends AbstractLayout & MainPage> {
    public abstract T getMainPage();
}

public class MyUI extends UI<MyPage> { // Compiler error: Bound mismatch

    @Override
    public MyPage getMainPage() {
        return new MyPage();
    }

}

public class MyPage implements MainPage {}

public class AbstractLayout {}

public interface MainPage {}

让 MyPage 扩展 AbstractLayout 将允许代码编译:

public class MyPage extends AbstractLayout implements MainPage {}

关于java - 无参数方法的多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21070048/

相关文章:

Javamail 不获取所有邮件

java - 如何正确分割这个字符串?

java - 如何在 Eclipse 中调试时访问对象和变量

java - 使用 jsonPath 匹配 boolean 真值

generics - Julia 如何扩展 isless 函数

java - 带有通配符参数的嵌套通用容器?

java - 泛型:获取实例名称

java - 从 forEach java 8 获取返回列表

java - 如何声明一个实现约束类类型的接口(interface)的类?

c# - 检索实体模型的通用方法