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/

10-09 16:00