class Person
{
String name;
String add;
Person(){}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
",add='" + add + '\'' +
'}';
}
public Person(String name,String add)
{
this.name=name;
this.add=add;
}
}
class PersonBuilder<E extends PersonBuilder<E>>{
String name;
String add;
E addName(String name)
{
this.name=name;
return (E)this;
}
E addAdd(String add)
{
this.add=add;
return (E)this;
}
Person build()
{
return new Person(name,add) ;
}
}
class Employee extends Person{
String doj;
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
",add='" + add + '\'' +
",doj='" + doj + '\'' +
'}';
}
Employee(String name,String add,String doj)
{
super(name,add);
this.doj=doj;
}
}
class EmployeeBuilder extends PersonBuilder<EmployeeBuilder>{
String doj;
EmployeeBuilder addDoj(String doj)
{
this.doj=doj;
return this;
}
Employee build()
{
return new Employee(name,add,doj);
}
}
public class FluentBuilderRecursiveGenerics{
public static void main(String[] args) {
1. EmployeeBuilder eb=new EmployeeBuilder();
2. Employee e=eb.addName("kamal").addAdd("dcd").addDoj("45").build();
3. System.out.println(e);
4. PersonBuilder pb=new PersonBuilder();
5. Person p=pb.addName("Kamal").addAdd("dlf").build();
6. System.out.println(p);
}
}
在这些代码行中我有两个问题要问。代码行与Fluent(设计模式)递归泛型相关。 首先,因为第1、2、3行正在运行,这意味着PersonBuilder方法的返回类型为EmployeeBuilder,但我还研究了类型擦除将其替换为边界,因此应将其替换为PersonBuilder(EmployeeBuilder),然后程序不应运行。 因为在泛型的情况下,函数的输入参数将由Erasure类型决定。 另一个问题是数字4,5,6行的擦除类型是什么。 谁能解释?
输出:
Employee{name='kamal',add='dcd',doj='45'}
Person{name='Kamal',add='dlf'}