Java 如何在超类中创建返回类型Subclass的方法
我对Java非常陌生,可以肯定地说,我只是迈出了第一步。如果这个问题有点尴尬,我很抱歉。 基本上,我想知道解决这个问题的最佳方法是什么 我有一个抽象类Java 如何在超类中创建返回类型Subclass的方法,java,Java,我对Java非常陌生,可以肯定地说,我只是迈出了第一步。如果这个问题有点尴尬,我很抱歉。 基本上,我想知道解决这个问题的最佳方法是什么 我有一个抽象类BasePage和HomePage,应该是从前者派生的。所有页面都可以加载,因此在基本页面上定义加载方法是有意义的,但我希望该方法在本例中返回主页类型,并且通常返回子类类型 从我所学到的,这似乎不是那么容易,我开始想也许是因为它的设计有缺陷。 我也有一些方法对所有页面都有效,其中之一是confirmAge,因为无论你进入哪个页面,你都会收到年龄限制
BasePage
和HomePage
,应该是从前者派生的。所有页面都可以加载,因此在基本页面
上定义加载方法是有意义的,但我希望该方法在本例中返回主页类型,并且通常返回子类类型
从我所学到的,这似乎不是那么容易,我开始想也许是因为它的设计有缺陷。
我也有一些方法对所有页面都有效,其中之一是confirmAge
,因为无论你进入哪个页面,你都会收到年龄限制,基本上你必须确认你已经超过18岁才能继续。因此,由于它是基本的,我认为它应该被编码到基本页面中
无论如何,无论我使用什么-抽象类或接口,我在返回类型方面都有相同的问题,我真的希望在从BasePage
派生的所有类上强制执行一些接口
任何帮助都将不胜感激 一种解决方案是使用泛型:
public abstract class SuperClass<T extends SuperClass<T>> {
protected abstract T someMethod();
}
public class SubClass extends SuperClass<SubClass> {
protected SubClass someMethod() {
return this;
}
}
公共抽象类超类{
受保护的抽象T somethod();
}
公共类子类扩展了超类{
受保护的子类someMethod(){
归还这个;
}
}
一种解决方案是使用泛型:
public abstract class SuperClass<T extends SuperClass<T>> {
protected abstract T someMethod();
}
public class SubClass extends SuperClass<SubClass> {
protected SubClass someMethod() {
return this;
}
}
公共抽象类超类{
受保护的抽象T somethod();
}
公共类子类扩展了超类{
受保护的子类someMethod(){
归还这个;
}
}
您可以添加实际类型作为基本页的类型参数:
public abstract class BasePage<T extends BasePage<?>> {
public abstract T load();
}
public class HomePage extends BasePage<HomePage> {
@Override
public HomePage load() {
return new HomePage();
}
}
公共抽象类BasePage您可以添加实际类型作为BasePage的类型参数:
public abstract class BasePage<T extends BasePage<?>> {
public abstract T load();
}
public class HomePage extends BasePage<HomePage> {
@Override
public HomePage load() {
return new HomePage();
}
}
公共抽象类BasePage泛型是这里的最佳选择。您不能在此处键入接口。以下是一个例子:
public interface Service<T> {
T execute();
}
public class MyService implements Service<String> {
private final String input1;
private final int input2;
public MyService(String input1, int input2) {
this.input1 = input1;
this.input2 = input2;
}
@Override
public String execute() {
return String.format("'%s%d'", input1, input2);
}
}
公共接口服务{
T执行();
}
公共类MyService实现服务{
私有最终字符串输入1;
私人最终整数输入2;
公共MyService(字符串input1,int input2){
this.input1=input1;
this.input2=input2;
}
@凌驾
公共字符串execute(){
返回字符串。格式(“%s%d”,input1,input2);
}
}
泛型是这里的最佳选择。您不能在此处键入接口。以下是一个例子:
public interface Service<T> {
T execute();
}
public class MyService implements Service<String> {
private final String input1;
private final int input2;
public MyService(String input1, int input2) {
this.input1 = input1;
this.input2 = input2;
}
@Override
public String execute() {
return String.format("'%s%d'", input1, input2);
}
}
公共接口服务{
T执行();
}
公共类MyService实现服务{
私有最终字符串输入1;
私人最终整数输入2;
公共MyService(字符串input1,int input2){
this.input1=input1;
this.input2=input2;
}
@凌驾
公共字符串execute(){
返回字符串。格式(“%s%d”,input1,input2);
}
}
解决您的用例的最简单方法-依赖
例如:
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) {
//...
}
}
如果除了返回类型之外还需要多态参数,请使用
例如:
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 load();
公开摘要无效(另一份);
}
公共类主页扩展基本页{
@凌驾
公共主页加载(){
//...
归还这个;
}
@凌驾
公共无效复制源(另一个主页){
//...
}
}
请注意,通用定义中的第二个
可以省略,从而缩短
class BasePage <T extends BasePage>
类基本页
在这种情况下,编译器将推断
class BasePage <T extends 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) {
//...
}
}
如果除了返回类型之外还需要多态参数,请使用
例如:
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 load();
公开摘要无效(另一份);
}
公共类主页扩展基本页{
@凌驾
公共主页加载(){
//...
归还这个;
}
@凌驾
公共无效复制源(另一个主页){
//...
}
}
请注意,通用定义中的第二个
可以省略,从而缩短
class BasePage <T extends BasePage>
类基本页
在这种情况下,编译器将推断
class BasePage <T extends BasePage<?>>
classbasepage我会这样设计:创建一个抽象类BaseClass
,并保持loadPage
方法未实现(抽象方法)。现在,从BaseClass
扩展的任何类都可以有自己的loadPage
实现
或者,在基类中编写一个基本的loadPage
方法。此方法应该包含像发出GET
请求这样的操作,这对于其对象需要加载页面的所有类来说都是通用的。然后,在基类的子类中,创建一些方法,如:homePageLoader
。此方法可以在基类中调用pageLoader
来发出GET
请求。我将其设计为:创建一个抽象类BaseClass
,并保持loadPage
方法未实现(抽象方法)。现在,从BaseClass
扩展的任何类都可以有自己的loadPage
实现
或者,在基类中编写一个基本的loadPage
方法。此方法应该包含像发出GET
请求这样的操作,这对于其对象需要加载页面的所有类来说都是通用的。然后,在基类的子类中,创建一些方法,如:homePageLoader
。此方法可以在基类中调用pageLoader
,以发出GET
请求。最佳方法?不超类不应该知道子类是否存在,更不用说它们是什么类型了。您可以只放置一个公共抽象类型getInstance(