Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,将对象强制转换为其父类以避免其属性_Java_Casting_Polymorphism_Serializable - Fatal编程技术网

在Java中,将对象强制转换为其父类以避免其属性

在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

我有一个类SuperYo扩展类角色,如下所示:

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是一个更好的主意。一个快速的解决方法是提供一个方法来构造父类的对象,但这似乎是一个肮脏的解决方案。