Java:从子类获取超类的实例

时间:2019-02-15 00:21:23

标签: java

考虑我有一个像下面这样的课程。

public class SuperClass
{
  private String a;
  private String b;
  //getter/setters
}

还有一个子类

public class ChildClass extends SuperClass
    {
      private String c;
      private String d;
      //getter/setters
    }

在另一个类中,我有一个ChildClass对象。该对象具有填充了数据的父类和子类成员变量。
使用该对象,我需要获取父类的实例,即,仅在父类中具有变量的对象(即a和b)。我该如何实现?

2 个答案:

答案 0 :(得分:2)

您可以通过强制转换类来实现,如果您有ChildClass实例,则可以使用以下命令获取SuperClass

SuperClass sc = (SuperClass) childClass;

SuperClass sc = childClass;

正如下面的评论所言,在这种情况下,您实际上不需要强制转换,只需将一个SuperClass变量接收到ChildClass即可。

之所以会这样,是因为总是可以进行 Upcast (从子级到超级级),因此隐式进行是安全的。仅在下调的情况下需要明确。

Here,您可以了解有关Java转换的更多信息。

答案 1 :(得分:2)

让我们退后一步,了解创建ChildClass实例时发生的情况。创建了一个存储位置来存储ChildClassSuperClass的字段。现在,您无法使该存储位置“忘记” ChildClass字段,而仅保留SuperClass字段。最好的办法是将ChildClass字段设为null

要执行您想要的操作,您将创建一个 new 对象。您可以使用以下方法来做到这一点:

public class ChildClass extends SuperClass {
    private String c;
    private String d;

    public SuperClass getSuperClassInstance() {
        SuperClass sc = new SuperClass();
        sc.a = this.a; //or use getters/setters
        sc.b = this.b; //you might need to deep clone objects
        return sc;
    }
}

如@ruakh所说,仅强制转换为SuperClass是不够的,因为只要指向相同的存储位置,就可以通过将数据强制转换回ChildClass来检索数据。

更新基于评论

因此,该 XY problem

您可以通过@JsonIgnore注释子类中的字段,也可以使用@JsonIgnoreProperties(value = { "c", "d" })在班级进行注释。

此外,this duplicate question中的答案也有帮助。

如果在其他情况下需要序列化这些字段,则可以使用JSON Views