Alo*_*lon 1 java generics method-chaining builder-pattern
我正在尝试通过继承支持构建器模式,以允许父级和子级的设置链没有问题。为此,我需要父类知道返回子类型,以使所有方法公开以进行链接。
这是我在本文之后编写的代码示例,我认为它应该可以工作。但是,正如您将看到的,使用a1的第一个示例可以正常工作,但是如果我更改设置器的顺序,则无法识别最后一个设置器。
问题是:一旦我从父类中调用了一个方法,它将以类型而不是子类型返回自身,即使认为T被定义为子类型。
public class JavaApplication1 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
A a1 = new B<>().setAge(0).setId(0).setName("name"); //Works fine
A a2 = new B<>().setAge(0).setName("name").setId(0); //setId is not found
}
static class A<T extends A> {
private String mpName;
T setName(String name) {
mpName = name;
return (T) this;
}
}
static class B<T extends B> extends A<T> {
private int mpAge;
private int mpId;
T setAge(int age) {
mpAge = age;
return (T) this;
}
T setId(int id) {
mpId = id;
return (T) this;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您应该按以下方式更改类定义:
static class A<T extends A<T>>
static class B<T extends B<T>> extends A<T>
Run Code Online (Sandbox Code Playgroud)
java.lang.Enum使用相同的声明。为什么它在真实需要,您可以找到解释这个职位。