Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无参数方法的多重继承性_Java_Generics - Fatal编程技术网

Java 无参数方法的多重继承性

Java 无参数方法的多重继承性,java,generics,Java,Generics,java泛型可以帮助强制一个没有参数的方法返回一个扩展a并实现B的对象吗 这就是我目前拥有的: public abstract class UI { public abstract MainPage getMainPage(); public void refresh() { MainPage mainPage = getMainPage(); if ( ! (mainPage instanceof AbstractLayout)) {

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 {}

不知道你所说的“从主页扩展AbstractLayout”是什么意思。AbstractLayout是一个类,MainPage是一个接口。我不明白。至于泛型,将它添加到getMainPage()的返回类型对编译器接受的内容没有影响,因为T不是来自参数。我删除了我的注释,因为它可能有点模棱两可。我不确定你的设计是否非常。。。聪明或好。为什么
getMainPage()
应该返回一个
AbstractLayout
——而且它没有以任何方式链接到页面(在您的设计中)?
MainPage
是否有任何实际用途(包括方法?)。如果不将泛型限制为可以填充任何类的类型,那么
UI
和定义
public t getMainPage()
将因此返回使用具体类指定的任何类型。
public class MyPage Extendes AbstractLayout implements MainPage{}
“getMainPage为什么要返回AbstractLayout?”因为UI把它放在一个布局容器中。“主页有什么真正的用途吗?”当然。为了让UI能够控制这个特定的布局,它必须能够与之交互。“…因此将返回任何类型…”。这正是我试图解决的问题。让代码编译不是问题。示例代码已经编译。我试图让编译器拒绝对getMainPage的重写,因为MyPage并不是AbstractLayout的子类。这正是它的作用。通过添加类型参数,代码将不会编译,因为MyPage不扩展AbstractLayout.Brilliant!我想我以前没注意。我按照你的建议做了,编译器现在用“返回类型MyPage与AbstractLayout不兼容”拒绝重写。非常感谢。
public class MyPage extends AbstractLayout implements MainPage {}