zoukankan      html  css  js  c++  java
  • 集合加泛型的类型转换

    问题引入

    背景:DbUtils.list("from User")返回是List<Object>类型

    需求:我们清楚的知道它的准确类型是List<User>,可能我们想直接的去进行类型的转换

    尝试:List<User> listUser= (List<User>)DbUtils.list("from User");

    结果:报错

    向下转型

      java中父类向下转型为子类是没问题的尽管存在类型安全的隐患:

    1 Object o= new Object();
    2 User u= new User();
    3 u= (User)o;
    4 o= u;

      为Object是所有类型的父级,所以任何对象都可以去转换成Object,因为有了这个继承的特性,有可能Object指向了一个User,而我们又需要使用这个User的方法,所以它支持存在安全隐患的强制向下转型,尽管存在安全隐患,但只要我们编码时稍微注意就可避免此隐患,因为我们知道这个Object指向的是一个User,所以有继承关系的向下类型转换是可避免的安全隐患。

    那么为什么List<User>和List<Object>转就不行?

      其实,这就像java中的二维数组初始化,你不能用下面的代码申请出5行10数据,而要先申请5行,后一行一行的申请。

    1 new int[5][10]

      也就是说,集合是一个二层的结构,不适用于一层结构的类型强制转换。在集合本身这一层来讲,List<User>和List<Object>不是同一类,也没有继承关系。

    不是同一类,没有继承关系的类不能强制类型转换

    1 String s= "a";
    2 Integer i= 12;
    3 i= (Integer)s;

    上面代码在编译期会报错,下面的代码在编译期不报错,到运行期才会抛异常。

    1 String s= "a";
    2 Integer i= 12;
    3 Object o= s;
    4 i= (Integer)o;

    集合类带泛型转换的办法

      既然我们无法直接转换,而又不想一个元素一个元素的去转类型,那么我们就间接的去转换吧。

    1,利用集合转数组指定类型的api

    1 List<User> listUser= Arrays.asList(DbUtils.list("from User").toArray(new User[0]));

    2,和1差不多

    1 List<User> listUser= new LinkedList<User>();
    2 Collections.addAll(listUser, DbUtils.list("from User").toArray(new User[0]));

    3,使用Object做为中介者(超赞的一种思想)

    1 List<User> listUser= (List<User>)(Object)DbUtils.list("from User");

    4,和3差不多

    1 Object object= DbUtils.list("from User");
    2 List<User> listCart= (List<User>)object;
  • 相关阅读:
    Python for Infomatics 第14章 数据库和SQL应用四(译)
    展望2017
    bing的简单英文字典工具
    自我安慰
    Python for Infomatics 第14章 数据库和SQL应用三(译)
    Python for Infomatics 第14章 数据库和SQL应用二(译)
    Python for Infomatics 第14章 数据库和SQL应用一(译)
    希望父亲早日恢复
    Python for Infomatics 第13章 网页服务四(译)
    Python for Infomatics 第13章 网页服务三(译)
  • 原文地址:https://www.cnblogs.com/guanghe/p/11362152.html
Copyright © 2011-2022 走看看