如何使用泛型从父方法到 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;
    }
  }
}