预先信息。
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给了我错误“方法的返回类型缺失”
答案 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)
答案 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
的美丽。根据您在运行时的输入,它会创建A
,B
或C
类中的任何一个X
,并使用引用{{1}}指向那个对象。我建议你浏览一下Factory Design Pattern,这将为你提供更多关于这种设计在现实生活中如何运作的信息。