Java 使方法返回类型为泛型
我有以下带有builder()方法的Manager类:Java 使方法返回类型为泛型,java,generics,Java,Generics,我有以下带有builder()方法的Manager类: 核心问题是奇怪的继承结构,它重载了类名Builder。我不能很好地解决这个问题,但是在某个时候,您的ManagerBuilder的特定类型信息丢失了。这可以简化很多: public class Employee extends Person { public static EmployeeBuilder builder() { return new EmployeeBuilder(); } pub
核心问题是奇怪的继承结构,它重载了类名
Builder
。我不能很好地解决这个问题,但是在某个时候,您的ManagerBuilder
的特定类型信息丢失了。这可以简化很多:
public class Employee extends Person {
public static EmployeeBuilder builder() {
return new EmployeeBuilder();
}
public static class EmployeeBuilder extends Person.Builder<Employee, EmployeeBuilder> {
@Override
protected EmployeeBuilder self() {
return this;
}
@Override
public Employee build() {
return new Employee(this);
}
}
}
public class Manager extends Employee {
public static ManagerBuilder builder() {
return new ManagerBuilder();
}
public static class ManagerBuilder extends Person.Builder<Manager, ManagerBuilder> {
@Override
protected ManagerBuilder self() {
return this;
}
@Override
public Manager build() {
return new Manager(this);
}
}
}
公共类员工扩展个人{
公共静态EmployeeBuilder(){
返回新的EmployeeBuilder();
}
公共静态类EmployeeBuilder扩展Person.Builder{
@凌驾
受保护的EmployeeBuilder self(){
归还这个;
}
@凌驾
公共雇员构建(){
返回新员工(本);
}
}
}
公共类管理器扩展了Employee{
公共静态管理器builder builder(){
返回新的ManagerBuilder();
}
公共静态类ManagerBuilder扩展Person.Builder{
@凌驾
受保护的ManagerBuilder self(){
归还这个;
}
@凌驾
公共管理器构建(){
返回新经理(本);
}
}
}
这会解决你的一些问题
现在你还有一个问题。静态方法builder
被不兼容的返回类型重载。有关此信息,请访问
如果您对这些方法进行不同的命名,它应该可以工作。核心问题是您奇怪的继承结构,它使类名
生成器
过载。我不能很好地解决这个问题,但是在某个时候,您的ManagerBuilder
的特定类型信息丢失了。这可以简化很多:
public class Employee extends Person {
public static EmployeeBuilder builder() {
return new EmployeeBuilder();
}
public static class EmployeeBuilder extends Person.Builder<Employee, EmployeeBuilder> {
@Override
protected EmployeeBuilder self() {
return this;
}
@Override
public Employee build() {
return new Employee(this);
}
}
}
public class Manager extends Employee {
public static ManagerBuilder builder() {
return new ManagerBuilder();
}
public static class ManagerBuilder extends Person.Builder<Manager, ManagerBuilder> {
@Override
protected ManagerBuilder self() {
return this;
}
@Override
public Manager build() {
return new Manager(this);
}
}
}
公共类员工扩展个人{
公共静态EmployeeBuilder(){
返回新的EmployeeBuilder();
}
公共静态类EmployeeBuilder扩展Person.Builder{
@凌驾
受保护的EmployeeBuilder self(){
归还这个;
}
@凌驾
公共雇员构建(){
返回新员工(本);
}
}
}
公共类管理器扩展了Employee{
公共静态管理器builder builder(){
返回新的ManagerBuilder();
}
公共静态类ManagerBuilder扩展Person.Builder{
@凌驾
受保护的ManagerBuilder self(){
归还这个;
}
@凌驾
公共管理器构建(){
返回新经理(本);
}
}
}
这会解决你的一些问题
现在你还有一个问题。静态方法builder
被不兼容的返回类型重载。有关此信息,请访问
如果您对这些方法进行不同的命名,它应该可以正常工作。您的代码工作得很好,
Manager.builder().age(25).build()
实际上返回一个管理器。这只是一个编译时问题
以下Junit测试应该成功(它在我的测试中成功):
事实上,如果您没有声明任何变量来承载构建器,并且由于方法age
没有在Manager.builder
中定义,也没有在其直接子类Employee.builder
中定义,Java编译器假定它将返回声明它的类的对象,即Person.builder
。它不是错误的,因为它实际上是一个祖先类。但是从这一点上讲,编译器不知道build()
返回的确切类,只知道它将是人
但编译器接受以下代码:
Manager.Builder<Manager,?> builder = Manager.builder();
Manager emp = builder.age(25).build();
Manager.Builder=Manager.Builder();
Manager emp=builder.age(25.build();
好的,您的代码运行得非常好,Manager.builder().age(25.build()
实际上返回了一个Manager
。这只是一个编译时问题
以下Junit测试应该成功(它在我的测试中成功):
事实上,如果您没有声明任何变量来承载构建器,并且由于方法age
没有在Manager.builder
中定义,也没有在其直接子类Employee.builder
中定义,Java编译器假定它将返回声明它的类的对象,即Person.builder
。它不是错误的,因为它实际上是一个祖先类。但是从这一点上讲,编译器不知道build()
返回的确切类,只知道它将是人
但编译器接受以下代码:
Manager.Builder<Manager,?> builder = Manager.builder();
Manager emp = builder.age(25).build();
Manager.Builder=Manager.Builder();
Manager emp=builder.age(25.build();
请同时添加age()
方法和Builder
classI已添加age()和Person类,感谢您的帮助请同时添加age()
方法和Builder
classI已添加age()和Person类,感谢您的帮助这很有趣,然而,我需要ManagerBuilder来扩展Employee.EmployeeBuilder而不是Person.Builder,然后它开始变得丑陋。公共静态类EmployeeBuilder扩展Person.Builder不工作这很有趣,但是我需要ManagerBuilder扩展Employee.EmployeeBuilder而不是Person.Builder,然后它开始变得丑陋。公共静态类EmployeeBuilder扩展Person.Builder不工作
Manager.Builder<Manager,?> builder = Manager.builder();
Manager emp = builder.age(25).build();