Java 如何在超类中创建返回类型Subclass的方法

Java 如何在超类中创建返回类型Subclass的方法,java,Java,我对Java非常陌生,可以肯定地说,我只是迈出了第一步。如果这个问题有点尴尬,我很抱歉。 基本上,我想知道解决这个问题的最佳方法是什么 我有一个抽象类BasePage和HomePage,应该是从前者派生的。所有页面都可以加载,因此在基本页面上定义加载方法是有意义的,但我希望该方法在本例中返回主页类型,并且通常返回子类类型 从我所学到的,这似乎不是那么容易,我开始想也许是因为它的设计有缺陷。 我也有一些方法对所有页面都有效,其中之一是confirmAge,因为无论你进入哪个页面,你都会收到年龄限制

我对Java非常陌生,可以肯定地说,我只是迈出了第一步。如果这个问题有点尴尬,我很抱歉。 基本上,我想知道解决这个问题的最佳方法是什么

我有一个抽象类
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(