Object类型转换成自定义类型(向下转型)


Object类型转换成自定义类型

场景:

  从数据库或者别的途径接收对象的时候用Object,但是用的时候怎么object点(方法提示 | alt+'/'),都点不出自定义类型的方法。

  比如,数据库查询Customer的时候,用Object来接收,那么想要调用Customer中的getCust_Id()方法,你会发现用Object怎么都点不出来。我之前头疼了很多次,今天做小demo,又碰巧用object接收,运气好的是这次我貌似琢磨出怎么转型了。

 

1.转型前(查询出来每条数据由一个Customer对象和Order对象组成,但是用的是Object接收)

  (普通内连接提到的是前两章学习Hibernate的总结(Hibernate(十三)迫切内连接fetch)

/** * 普通内连接 */ @Test public void fun(){ Session session = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); List<Object[]> list = session.createQuery("from Customer cst inner join cst.ods").list(); for (Object[] objects : list) { System.out.println(Arrays.toString(objects)); } tx.commit(); session.close(); }

2.向下转型后(将接收的两个Object对象分别向下转型为Customer和Order对象)

/** * object类型转换成自定义实体类型 */ @Test public void fun2(){ Session session = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); //查询用户(因为是普通内连接,所以会每一条数据会封装成两个对象,一个是Customer,一个是Order)
        List<Object[]> list = session.createQuery("from Customer cst inner join cst.ods").list(); System.out.println("--------------------------------------------------------------------------------------------------------"); for (Object[] objects : list) { //这里的length是其实就是2
            for(int i = 0;i < objects.length;i++){ //如果第i个对象是Customer的实例
                if (objects[i] instanceof Customer) { //就实例化Customer对象,将第一个object对象向下转型
                    Customer c = (Customer) objects[i]; //打印Customer对象中的属性
                    System.out.println("用户ID:" + c.getCust_id() + "\t" + "用户名:" + c.getCust_name()); //后面就不需要执行了
                    continue; }else if(objects[i] instanceof Order){ Order od = (Order)objects[i]; System.out.println("订单编号:" + od.getOrder_id() + "\t" + "订单明细编号:" + od.getDetail_id()); continue; }else{ System.out.println("object[" + i + "]" + "不是Customer的实例也不是Order的实例~"); } } System.out.println("--------------------------------------------------------------------------------------------------------"); } tx.commit(); session.close(); }

部分查询结果:

 

总结:首先,我感觉我有很多词汇用的不恰当或者概念理解错误,比如,这个应该是向下转型把....

   想明白了还挺开心的(虽然问题有点弱智...),然后再转型之前加上了判断是否是这个类型(instanceof),保证了程序的合理性。

     想到刚刚在哪里,什么Class.forName,什么newInstance,getMethod在哪里瞎鼓捣反射就无语...

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM