【发布时间】:2020-04-17 08:54:23
【问题描述】:
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 类型决定。 另一个问题是 Erasure 将为第 4、5、6 行执行什么类型的操作。 谁能解释一下?
输出:
Employee{name='kamal', add='dcd', doj='45'}
Person{name='Kamal', add='dlf'}
【问题讨论】:
-
你的术语太离谱了,无法解释这里发生了什么。请简单地谷歌“java类型擦除”并阅读几个小时/天。这段代码没有什么复杂的,它非常基础,完全可以预期这段代码可以编译和工作。
标签: java design-patterns fluent