2

预信息。

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 ?    
}

我需要创建一个方法,该方法接受 aString并返回一个对象,该对象是Person.

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

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

PS 试过<? extends Person>,但 Eclipse 给了我错误“缺少返回类型的方法”

4

4 回答 4

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);

请注意,ClassCastExceptions如果您传入彼此不匹配的 String 和 Class 参数,可能会导致这种情况。

于 2013-10-08T17:57:00.510 回答
1

X应该是Person

因为Person是一个抽象类并且不能被实例化,所以它总是会返回你的一个子类型。

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

于 2013-10-08T17:52:46.023 回答
1
public Person getPersonByType(String type){
// analyze type and return appropriate instance...
    if ("A instance".equals(type)) {
        return new A();
    }
...

}
于 2013-10-08T17:57:25.057 回答
1

你应该返回Person X。作为Person一种抽象类型,它不能被实例化。你可以拥有Person X一个reference应该指向任何具体实现的对象,在你的情况下PersonA B& C。这就是美run time polymorphism。根据您在运行时的输入,它将创建object任何A,BC类并使用引用X指向该对象。我建议您通过工厂设计模式,这将为您提供有关此类设计如何工作的更多信息在现实生活场景中。

于 2013-10-08T18:05:07.757 回答