【问题标题】:How to create method with return type as any subType of superclass如何创建返回类型为超类的任何子类型的方法
【发布时间】:2017-12-01 19:28:24
【问题描述】:

预告信息。

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 给了我错误“缺少返回类型的方法”

【问题讨论】:

  • 让它返回Person
  • @gangqinlaohu:没有迹象表明泛型在这里是合适的。
  • 请查看添加的更多信息。 Tnx

标签: java oop inheritance


【解决方案1】:

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

【讨论】:

  • 正确的声明是:public &lt;T extends Person&gt; T getPersonByType(String type, Class&lt;T&gt; type) {...}
【解决方案2】:

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

【讨论】:

【解决方案3】:

X 应该是 Person

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

如果你想知道你的调用方法返回了什么getPersonByType,你可以使用instanceof操作符

【讨论】:

    【解决方案4】:
    public Person getPersonByType(String type){
    // analyze type and return appropriate instance...
        if ("A instance".equals(type)) {
            return new A();
        }
    ...
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 2013-10-17
      相关资源
      最近更新 更多