Java:派生类中的方法链

标签 java

我正在编写一个具有方法链接的 DerivedClass(扩展 SuperClass)。例如,

public class SuperClass {
    protected int responseCode;
    protected String responseMessage;

    public void setResponseCode(int code) {
            this.responseCode = code;
    }

    public int getResponseCode() {
            return responseCode;
    }

    public SuperClass withResponseCode(int code) {
            setResponseCode(code);
            return this;
    }

    public void setResponseMessage(String message) {
            this.responseMessage = message;
    }

    public String getResponseMessage() {
            return responseMessage;
    }

    public SuperClass withResponseMessage(String message) {
            setResponseMessage(message);
            return this;
    }

}

还有

public class DerivedClass extends SuperClass {
    protected String credentialType;
    protected String credentialId;

    public void setCredentialType(String type) {
            this.credentialType = type;
    }

    public String getCredentialType() {
            return credentialType;
    }

    public DerivedClass withCredentialType(String type) {
            setCredentialType(type);
            return this;
    }


    public void setCredentialId(String id) {
            this.credentialId = id;
    }

    public String getCredentialId() {
            return credentialId;
    }

    public DerivedClass withCredentialId(String id) {
            setCredentialId(id);
            return this;
    }

    public static void main(String[] args) {
            DerivedClass dc = new DerivedClass();
            /*dc.setResponseCode(200);
            dc.setResponseMessage("SUCCESS");
            dc.setCredentialType("MobileIdentifier");
            dc.setCredentialId("678882");*/

            dc.withResponseCode(200)
                    .withResponseMessage("SUCCESS")
                    .withCredentialType("MobileIdentifier")
                    .withCredentialId("678882");

            System.out.println("Derived Class: Code - " + dc.getResponseCode() + " - Response Message - " + dc.getResponseMessage() + " - Credential Type - " + dc.getCredentialType());
    }

}

在编译上述内容期间,我得到:

DerivedClass.java:41: error: cannot find symbol
                    .withCredentialType("MobileIdentifier")
                    ^
symbol:   method withCredentialType(String)
location: class SuperClass
1 error

当 CredentialType 是 DerivedClass 中的字段而不是 SuperClass 中的字段时,为什么我会收到此消息?如何使用 DerivedClass 对象链接 SuperClass 和 DerivedClass 中的混合方法?

最佳答案

正如其他人所说,您收到该编译错误是因为您的 SuperClass 的方法返回 SuperClass 类型,该类型不包含您的 DerivedClass 的方法。

解决此问题的正确方法是使 SuperClass 抽象化,并在 SuperClass 上使用递归类型的泛型(也称为 F-bound type ):

public abstract class SuperClass<T extends SuperClass<T>> {

    // TODO attributes, getters and setters

    public T withResponseCode(int code) {
        setResponseCode(code);
        return (T) this; // this cast is absolutely safe!
    }

    // TODO other SuperClass builder methods
}

然后,您可以按如下方式定义 DerivedClass:

public class DerivedClass extends SuperClass<DerivedClass> {

    // TODO attributes, getters and setters

    public DerivedClass withCredentialType(String type) {
        setCredentialType(type);
        return this;
    }

    // TODO other DerivedClass builder methods
}

并且不会再出现任何编译错误。这种方法的缺点是它迫使您将 SuperClass 类抽象化,以便仅使用派生类。

关于Java:派生类中的方法链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43418811/

相关文章:

java - UDF中如何传递Row?

java - 使用 Maven 和 IntelliJ 创建 JSF 项目

java - JPA Hibernate,如何在创建时进行验证并忽略更新时的验证

Java - 如何用txt文件的某些部分填充组合框

java - Java如何从第一行开始向mysql表的特定字段插入数据

java - 计算 Android/Google map 中行驶的距离

Javassist:如何将动态生成的类添加到特定包中?

java - 如何使用 JavaMail API 在电子邮件中嵌入电子邮件中附加文件的链接?

java - 如何等待主线程直到AWS S3文件上传完成

java - 获取整数值