java - 如何在超类中创建一个返回类型子类的方法
问题描述
我对 Java 很陌生,可以肯定地说我只是迈出了第一步。如果这个问题有点尴尬,我很抱歉。基本上我想知道解决我遇到的问题的最佳方法是什么。
我有一个抽象类BasePage
,HomePage
它应该是从前者派生的。可以加载所有页面,因此在 上定义 load 方法是有意义的BasePage
,但我希望该方法在这种情况下返回 HomePage 的类型和一般的 SubClass 类型。
从我了解到的情况来看,这似乎并不容易,我开始认为这可能是因为它的设计有缺陷。我还有一些对所有页面都有效的方法,其中之一是confirmAge
, 因为无论你去哪个页面,你总是会遇到年龄限制,基本上你必须确认你已经 18 岁以上才能继续。因此,既然它是基本的东西,我相信它应该被编码到BasePage
.
无论如何,无论我使用什么 - 抽象类或接口,我在返回类型方面都有同样的问题,我真的很想对所有从BasePage
.
任何帮助,将不胜感激。
解决方案
- 解决用例的最简单方法 - 依赖协变返回类型
例子:
public abstract class BasePage {
public abstract BasePage load();
}
public class HomePage extends BasePage {
@Override
public HomePage load() {
//...
return this;
}
}
- 如果除了返回类型之外还需要多态参数 - 使用泛型
例子:
public abstract class BasePage <T extends BasePage<T>> {
public abstract T load();
public abstract void copyFrom(T another);
}
public class HomePage extends BasePage<HomePage> {
@Override
public HomePage load() {
//...
return this;
}
@Override
public void copyFrom(HomePage another) {
//...
}
}
注意,<T>
通用定义中的第二个可以省略,给出更短的
class BasePage <T extends BasePage>
在这种情况下,编译器会推断
class BasePage <T extends BasePage<?>>
这仍然适合您的一般情况
推荐阅读
- ruby-on-rails - Rails 并发问题锁定
- javascript - 加载图像路径以使用图像 ReactJS 创建组件
- node.js - 是否可以编辑 JWT 令牌的过期时间?
- angular - Angular RxJS 过滤器 - 返回一个空的或填充的 Observable 列表
- python - 是否可以将以一种方式堆叠的 Python 数组重塑为另一种堆叠类型?
- ghostscript - 重新调整整个 EPS 文件帧边界
- reactjs - React 元素未呈现/React 设置问题
- javascript - 数据未保存在数据库中
- java - 为什么在扩展自定义 toast 消息时附加到根 ViewGroup?
- python - 如何在python中用字符串替换字符串