如何使超类方法返回子类实例

6

我有一个名为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。


你的 Test 类会是 抽象类 吗? - Rohit Jain
2个回答

10

让一个方法返回其所有者(this)以便能够“链接”多个方法调用,这被称为流畅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);

另请参阅:使用泛型在Java中构建流畅的API


0

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

你必须重写这些方法,这样你就可以在SubTest中返回this,一个SubTest,例如:

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

我必须为所有类覆盖所有方法吗? - MinusKube
是的,否则它们将返回this类型为Test。至少重写是微不足道的。 - rgettman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接