将Object转换为其父类以避免其在Java中的属性

时间:2012-11-03 00:44:54

标签: java casting polymorphism serializable

我有类SuperYo扩展类Persona,像这样:

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

}

问题是,我从SuperYo中向LinkedList添加了一个Persona实例:

LinkedList<Persona> list = new LinkedList<Persona>();
list.add((Persona) superYo);

它将它添加为SuperYo对象!使用所有NonSerializableObjs ...因此,不能从套接字发送:(。

所以,问题是......是否有任何方法可以将一个对象“向下转移”到它的父类,所以它的归属不存在?

谢谢!

2 个答案:

答案 0 :(得分:0)

施法是多态的问题。当你将type1的对象转换为type2时,实例不会改变,但你只是从一个新的角度看实例!

如果要通过网络发送子类,可以将SuperYo成员设置为瞬态,并在实例化时填充它们。或者,您可以将writeObject()和readObject()方法添加到子类中。

答案 1 :(得分:0)

readObject中实施writeObjectSuperYo,如下所示:

 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();
}

一旦你这样做,就不需要降级了。此外,您可以更好地控制对象中的其他非可序列化属性。