如何使用泛型从父方法到 return 子类型以支持构建器模式
How to use generics to return child type from a parent method to support builder pattern
我正在尝试通过继承来支持构建器模式,以允许从父项和子项 class 链接 setter 没有问题。为此,我需要父 class 知道 return 返回子类型以保持公开所有方法以进行链接。
这是我在 article 之后编写的代码示例,我认为它应该可以工作,但是正如您将看到的,第一个使用 a1 的示例工作正常,但是如果我更改 setters,最后的setter不被识别。
问题是:一旦我从父 class 调用一个方法,它将 return 本身作为一个类型而不是子类型,甚至认为 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;
}
}
}
您应该将 类 定义更改如下:
static class A<T extends A<T>>
static class B<T extends B<T>> extends A<T>
java.lang.Enum
使用相同的声明。您可以在 this post 中找到为什么需要它的解释。
我们是否需要子项的参数化类型 class?
class Class {
public static void main(String[] args) {
new Child().setAge(0).setId(0).setName("name");
new Child().setAge(0).setName("name").setId(0);
}
static class Parent<C extends Parent> {
private String mpName;
C setName(String name) {
mpName = name;
return (C) this;
}
}
static class Child extends Parent<Child> {
private int mpAge;
private int mpId;
Child setAge(int age) {
mpAge = age;
return this;
}
Child setId(int id) {
mpId = id;
return this;
}
}
}
我正在尝试通过继承来支持构建器模式,以允许从父项和子项 class 链接 setter 没有问题。为此,我需要父 class 知道 return 返回子类型以保持公开所有方法以进行链接。
这是我在 article 之后编写的代码示例,我认为它应该可以工作,但是正如您将看到的,第一个使用 a1 的示例工作正常,但是如果我更改 setters,最后的setter不被识别。
问题是:一旦我从父 class 调用一个方法,它将 return 本身作为一个类型而不是子类型,甚至认为 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;
}
}
}
您应该将 类 定义更改如下:
static class A<T extends A<T>>
static class B<T extends B<T>> extends A<T>
java.lang.Enum
使用相同的声明。您可以在 this post 中找到为什么需要它的解释。
我们是否需要子项的参数化类型 class?
class Class {
public static void main(String[] args) {
new Child().setAge(0).setId(0).setName("name");
new Child().setAge(0).setName("name").setId(0);
}
static class Parent<C extends Parent> {
private String mpName;
C setName(String name) {
mpName = name;
return (C) this;
}
}
static class Child extends Parent<Child> {
private int mpAge;
private int mpId;
Child setAge(int age) {
mpAge = age;
return this;
}
Child setId(int id) {
mpId = id;
return this;
}
}
}