如何使Superclass方法返回SubClass的实例

时间:2015-03-02 22:01:56

标签: java subclass

我有一个名为Test的类和一个名为SubTest的类,它扩展了Text,我希望在Test类中有一个方法可以返回实例SubTest被叫时,我想这样做:

SubTest test = new SubTest().setTest("Hello!").setOtherTest("Hi!");

setTest()setOtherTest()方法应该在Test类中。

但是当我这样做时:

public Test setTest(String test) { return this; }

它只返回Test的实例,因此我必须将Test投射到SubTest,但我不想这样做。

有可能吗?如果是,怎么做?

谢谢,MinusKube。

2 个答案:

答案 0 :(得分:9)

让方法返回其所有者(this)以便能够链接'多个方法调用称为 fluent API 。您可以使用泛型来解决您的问题,尽管结果代码可能在某种程度上不太可读:

public class Person<T extends Person<T>> {
    public T setName(String name) {
        // do anything
        return (T)this;
    }
}

public class Student extends Person<Student> {
    public Student setStudentId(String id) {
        // do anything
        return this;
    }
}

public class Teacher extends Person<Teacher> {
    public Teacher setParkingLotId(int id) {
        // do anything
        return this;
    }
}

现在,您不需要任何演员阵容:

Student s = new Student().setName("Jessy").setStudentId("1234");
Teacher t = new Teacher().setName("Walter").setParkingLotId(17);

另请参阅:Using Generics To Build Fluent API's In Java

答案 1 :(得分:0)

这些方法可以返回SubTest,因为Java的返回类型是协变的。

您必须覆盖这些方法,以便在this中返回SubTestSubTest,例如:

@Override
public SubTest setTest(String message) {
    super.setTest(message);  // same functionality
    return this;
}