在Java中,将对象强制转换为其父类以避免其属性
我有一个类SuperYo扩展类角色,如下所示:在Java中,将对象强制转换为其父类以避免其属性,java,casting,polymorphism,serializable,Java,Casting,Polymorphism,Serializable,我有一个类SuperYo扩展类角色,如下所示: public class SuperYo extends Persona { private NotSerializableObj obj1 private NotSerializableObj obj2 private NotSerializableObj obj3 } public class Persona { private SerializableObj sObj1 private Serializa
public class SuperYo extends Persona {
private NotSerializableObj obj1
private NotSerializableObj obj2
private NotSerializableObj obj3
}
public class Persona {
private SerializableObj sObj1
private SerializableObj sObj2
private SerializableObj sObj3
}
问题是,我在LinkedList中添加了一个来自SuperYo的Persona实例:
LinkedList<Persona> list = new LinkedList<Persona>();
list.add((Persona) superYo);
LinkedList=新建LinkedList();
添加((角色)superYo);
它将其添加为SuperYo对象!上面有所有的非序列化对象。。。因此,无法从套接字发送:(
所以,问题是…有没有办法将一个对象“向下投射”到它的父类,这样它的属性就不存在了
谢谢!强制转换是多态性的问题。当您将type1对象强制转换为type2时,实例不会改变,但您只需从新的角度查看实例即可
如果要通过网络发送子类,可以将SuperYo成员设置为临时成员,并在实例化时填充。或者可以将writeObject()和readObject()方法添加到子类。在
SuperYo
中实现readObject
和writeObject
,如下所示:
private void writeObject(ObjectOutputStream outStream) throws IOException {
//write attributes from PersonYo only
outStream.defaultWriteObject();
outStream.writeObject(sObj1);
outStream.writeObject(sObj2);
outStream.writeObject(sObj2);
}
private void readObject(ObjectInputStream inStream) throws IOException,
ClassNotFoundException {
//read attributes from PersonYo only
inStream.defaultReadObject();
sObj1= (SerializableObj)inStream.readObject();
sObj2= (SerializableObj)inStream.readObject();
sObj3= (SerializableObj)inStream.readObject();
}
一旦这样做,就不需要向下转换。此外,您还可以更好地控制对象中其他不可序列化的属性。您观察到的行为几乎就是多态性的全部要点。如果您真的想摆脱这些字段,您应该重新考虑您的设计。也许可以使用组合而不是继承NCE是一个更好的主意。一个快速的解决方法是提供一个方法来构造父类的对象,但这似乎是一个肮脏的解决方案。