2015-03-02 63 views
5

的例子中,我有一个类叫做Test和一个叫SubTest谁扩展Text类,我想有一个方法在Test类调​​用的时候谁都会返回SubTest的情况下,我会喜欢做的事:如何使超类方法返回子类

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

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

但是当我做:

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

它只返回Test实例,所以我必须投TestSubTest,但我不想。

可能吗?如果是,如何?

Thanks,MinusKube。

+0

你的'Test'类是'abstract'吗? – 2015-03-02 22:11:11

回答

7

有一个方法返回其所有者(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); 

参见:Using Generics To Build Fluent API's In Java

+0

直指点 – pisaruk 2017-11-22 00:27:44

0

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

您必须覆盖这些方法,这样就可以返回this,一个SubTest,在SubTest,如:

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

我是否必须重写所有类的所有方法? – MinusKube 2015-03-02 22:15:44

+0

是的,否则他们会返回'this'类型为'Test'。至少重写是微不足道的。 – rgettman 2015-03-02 22:16:45