我正在编写一个具有方法链接的 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/