Java 父类子类转换的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 父类子类转换的问题相关的知识,希望对你有一定的参考价值。

遇到的问题是这样的。
Base为父类,childA,childB,childC分别继承Base。
在客户端方面将childA,childB,childC之中的一个对象先序列化传到服务器端。
问题是在服务器端怎么写一个统一的函数得到原来的对象。
我理解好像还是一个父类转子类的问题。。。

首先反序列化得到一个Object,可以将Object转换成Base类
Base类应该设计有一个抽象方法用来区分子类,比如commandId()
然后服务端就可以通过CommandID来设计每个CommandID一个服务处理类的子类,
再服务处理父类通过泛型设计,抽象出一个转换为泛型类的动作,就可以实现子类的动态识别转换了

只能说个大概思路,具体实现要对泛型比较了解和较好的抽象能力

//转换处理参考:服务处理父类(抽象类)
public String execute(Object object) throws Exception
H handler = (H)object;


//子类实现缓存处理
public void setApplicationContext(ApplicationContext ac) throws BeansException
for (Base bean : ac.getBeansOfType(Base.class).values())
this.put(bean.getCommandId(), bean);
参考技术A     Object o = new ChildA();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(o);
    oos.flush();
    byte[] bytes = baos.toByteArray();

    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
    ObjectInputStream ois = new ObjectInputStream(bais);
    Object deserialized = ois.readObject();
    // 反序列化后通过instanceof判断是哪个类
    if (deserialized instanceof ChildA) 
      System.out.println(ChildA.class.getName());
     else if (deserialized instanceof ChildB) 
      System.out.println(ChildB.class.getName());
     else if (deserialized instanceof ChildC) 
      System.out.println(ChildC.class.getName());
     else
      throw new Exception("未知的类:" + o.getClass().getName());

本回答被提问者采纳
参考技术B class Person
class Student extends Person
class Postgraduate extends Student
class Animal 
public class InstanceofTester 
public static void main(String[] args) 
  instanceofTest(new Student());

public static void instanceofTest(Person p)
  // 判断p的真正类型
  if (p instanceof Postgraduate)
   System.out.println("p是类Postgraduate的实例");
   else if(p instanceof Student)
   System.out.println("p是类Student的实例");
   else if(p instanceof Person)
   System.out.println("p是类Person的实例");
   else if(p instanceof Object) 
   System.out.println("p是类Object的实例");
  
  /*if(p instanceof Animal)//此错编译错误,所以做注释
   System.out.println("p是类Animal的实例");
  */

追问

是这样的。。。
服务器端得到的只是字节流byte[]
需要先反序列化这串字节流,这时就需要讨论是属于哪一个类

追答

Sorry没有仔细看题哈..

额.这个反序列化倒是没怎么实践过,那我就给点建议吧

要不你就正常反序列化,能用Object类型接收了再做判断么?

参考技术C Base getChild()
............



Base abc = getChild();

if( abc instanceof ChildA)
........

else if( abc instanceof ChildB)
........

else if( abc instanceof ChildC)
.........

参考技术D 搞一个接口,之后不用管这是个啥,调用方法就可以了

java中怎样做可以把父类强制转换成子类

JAVA是强类型的语言。当引用对象的时候,如果是上溯的话,需要强制转换。如你上面写的,
PiePlot p = (PiePlot)Plot,这就是上溯,生成实例时引用的是父类,需要强制转换,所以就需要加个(PiePlot)来声明Plot(Plot是父类)。
参考技术A 或许你的意思是父类对象指向子类对象的引用。

比如:父类A,子类B可以写成:A a=new B();

要不你就去研究一下里氏替换原则

以上是关于Java 父类子类转换的问题的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中如何对父类对象强制转换子类对象的引用

java 子类与父类转换

java 父类向子类转型的问题

java 里 可以把一个父类强制转换成一个子类 不能把一个子类强制转换成一个父类? 对吗?

java中怎样做可以把父类强制转换成子类

Java:父类对象为啥能转换成子类对象