如何使超类方法 returns 成为子类的实例
How to make Superclass Method returns instance of SubClass
我有一个名为 Test
的 class 和一个名为 SubTest
的 class 扩展了 Text
,我想在 Test
class 谁会 returns 调用 SubTest
的实例,我想做 :
SubTest test = new SubTest().setTest("Hello!").setOtherTest("Hi!");
setTest()
和 setOtherTest()
方法应该在 Test
class.
中
但是当我这样做的时候:
public Test setTest(String test) { return this; }
它只是 returns Test
的实例,所以我必须将 Test
转换为 SubTest
,但我不想这样做。
可能吗?如果是,如何?
谢谢,MinusKube。
可以将这些方法 return 设为 SubTest
,因为 Java 的 return 类型是协变的。
您必须覆盖这些方法,以便您可以在 SubTest
中 return this
、SubTest
,例如:
@Override
public SubTest setTest(String message) {
super.setTest(message); // same functionality
return this;
}
拥有一个方法return它的所有者(this
)能够'chain'多个方法调用流畅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);
我有一个名为 Test
的 class 和一个名为 SubTest
的 class 扩展了 Text
,我想在 Test
class 谁会 returns 调用 SubTest
的实例,我想做 :
SubTest test = new SubTest().setTest("Hello!").setOtherTest("Hi!");
setTest()
和 setOtherTest()
方法应该在 Test
class.
但是当我这样做的时候:
public Test setTest(String test) { return this; }
它只是 returns Test
的实例,所以我必须将 Test
转换为 SubTest
,但我不想这样做。
可能吗?如果是,如何?
谢谢,MinusKube。
可以将这些方法 return 设为 SubTest
,因为 Java 的 return 类型是协变的。
您必须覆盖这些方法,以便您可以在 SubTest
中 return this
、SubTest
,例如:
@Override
public SubTest setTest(String message) {
super.setTest(message); // same functionality
return this;
}
拥有一个方法return它的所有者(this
)能够'chain'多个方法调用流畅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);