如何使用返回类型创建方法作为超类的任何子类型

时间:2013-10-08 17:49:29

标签: java oop inheritance

预先信息。

public abstract class Person {}
public class A extends Person{}
public class B extends Person{}
public class C extends Person{}

public X getPersonByType(String type){
    //This Method will return either A or B or C based on type
    //what should X be ?    
}

我需要创建一个方法,该方法接收String并返回一个Person子类型的对象。

更多信息。 每个类A B C都具有属性public List角色。这些不能移动到Person类,因为我需要这些唯一命名的(JPA多对多表)。

现在如果可能的话,我不希望它返回person,因为我无法访问角色属性(Person不知道它)。我也更喜欢一种解决方案(如果可能的话),它不需要我施放或使用instanceOf(如果可能的话,再次使用)。

P.S尝试了<? extends Person>,但是Eclipse给了我错误“方法的返回类型缺失”

4 个答案:

答案 0 :(得分:3)

public Person getPersonByType(String type)应该可以正常运行,因为所有返回类型都会延伸Person

如果要在调用此方法后避免instanceof检查,还可以添加其他类参数:

public <T extends Person> T getPersonByType(String type, Class<T> type) {
   ...
   // cast result to T
}

使用这种方式,您可以直接将返回类型分配给子类:

C c = getPersonByType("c", C.class);

请注意,如果传入的String和Class参数彼此不匹配,则会导致ClassCastExceptions

答案 1 :(得分:1)

X应为Person

由于Person是一个抽象类,无法实例化,因此它将始终返回您的一个子类型。

如果您需要了解调用方法返回的getPersonByType内容,可以使用instanceof运算符

答案 2 :(得分:1)

public Person getPersonByType(String type){
// analyze type and return appropriate instance...
    if ("A instance".equals(type)) {
        return new A();
    }
...

}

答案 3 :(得分:1)

您应该返回Person X。由于Person是抽象类型,因此无法实例化。您可以将Person X作为reference,指向Person A的任何具体实现的对象B C&amp;在你的情况下run time polymorphism。这是object的美丽。根据您在运行时的输入,它会创建ABC类中的任何一个X,并使用引用{{1}}指向那个对象。我建议你浏览一下Factory Design Pattern,这将为你提供更多关于这种设计在现实生活中如何运作的信息。