Java 无参数方法的多重继承性
java泛型可以帮助强制一个没有参数的方法返回一个扩展a并实现B的对象吗 这就是我目前拥有的: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)) {
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 {}