Java 使方法返回类型为泛型

Java 使方法返回类型为泛型,java,generics,Java,Generics,我有以下带有builder()方法的Manager类: 核心问题是奇怪的继承结构,它重载了类名Builder。我不能很好地解决这个问题,但是在某个时候,您的ManagerBuilder的特定类型信息丢失了。这可以简化很多: public class Employee extends Person { public static EmployeeBuilder builder() { return new EmployeeBuilder(); } pub

我有以下带有builder()方法的Manager类:


核心问题是奇怪的继承结构,它重载了类名
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();