考虑我有一个像下面这样的课程。
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)。我该如何实现?
答案 0 :(得分:2)
您可以通过强制转换类来实现,如果您有ChildClass
实例,则可以使用以下命令获取SuperClass
:
SuperClass sc = (SuperClass) childClass;
或
SuperClass sc = childClass;
正如下面的评论所言,在这种情况下,您实际上不需要强制转换,只需将一个SuperClass
变量接收到ChildClass
即可。
之所以会这样,是因为总是可以进行 Upcast (从子级到超级级),因此隐式进行是安全的。仅在下调的情况下需要明确。
Here,您可以了解有关Java转换的更多信息。
答案 1 :(得分:2)
让我们退后一步,了解创建ChildClass
实例时发生的情况。创建了一个存储位置来存储ChildClass
和SuperClass
的字段。现在,您无法使该存储位置“忘记” 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。