理解Java中Fluent Builder模式中的递归泛型



因此,我一直在使用以下代码来尝试理解递归泛型。

class Person
{
public String name;
public String position;
@Override
public String toString() {
return "Person{" +
"name='" + name + ''' +
", position='" + position + ''' +
'}';
}
}
//This is called a recursive generic.
class PersonBuilder<SELF extends PersonBuilder<SELF>>
{
protected Person person = new Person();
public SELF withName(String name)
{
person.name = name;
//System.out.println(this.getClass());
//System.out.println(self().getClass());
return self();
}
public Person build()
{
return person;
}
protected SELF self()
{
return (SELF) this;
}

}
class EmployeeBuilder extends PersonBuilder<EmployeeBuilder>
{
public EmployeeBuilder worksAt(String position)
{
person.position = position;
return self();
}
@Override
protected EmployeeBuilder self()
{
return this;
}
}
class Demo1
{
public static void main(String[] args) {
EmployeeBuilder eb = new EmployeeBuilder();
Person richard = eb.withName("Richard")
.worksAt("Programmer")
.build();
System.out.println(richard);
PersonBuilder pb = new PersonBuilder<>();
Person bob = pb.withName("Bob").build();
}
}

我有几个问题与上述实施有关。

  1. 为什么这被称为递归泛型?它是递归的,因为父类有一个子类作为泛型吗?我知道目标是我们需要在继承的withName方法中返回Child类的Object,以便能够调用Child和Parent类中的方法。

  2. PersonBuilder<SELF>和PersonBuilder之间有什么区别?例如,我用PersonBuilder pb = new PersonBuilder<>()在main方法中创建了一个PersonBuilder对象。<gt;如果只是家长班的话?

  • ;消失";以某种方式我之所以这么问,是因为当我使用this.getClass((打印类时,我只得到了PersonBuilder作为类,这就是为什么我认为泛型不知怎么就不见了。另一方面,由于类签名附带了泛型,我有一种感觉,它一定潜伏在某个地方
  1. 如果我将类签名更改为class PersonBuilder<SELF extends PersonBuilder>,会有什么区别?我用这个更改运行了代码,它仍然有效。我有一种感觉,这与保持一致有关,但我对正在发生的事情没有足够的了解,无法理解这是如何产生影响的

感谢您的帮助。

Java实际上为您提供了使用原始类型的自由。

例如,如果PersonBuilder(没有尖括号<>(是一个原始类型,即它的泛型部分没有定义。

有一种方法类似于

列出<gt;someList=getList((;//假设存在一个API,它返回一个列表,但类型未知,这是一个通配符。

作为Q2的一部分。PersonBuilder pb = new PersonBuilder<>()

这只是一个原始类型引用,它包含一个泛型类型对象(java没有限制您这样做,主要是为了向后兼容性,但不建议使用(

generic "disappear" somehow-实际上泛型类型是运行时的东西,但是类在编译时是可用的。

getClass将始终为您提供类,而不是它的泛型类型。有一种方法可以获得泛型类型,但那就是使用一些反射。

您可以查看这个ques,了解如何在运行时检索泛型类型的详细信息。在运行时获取类的泛型类型

最新更新