• 集合加泛型的类型转换


    问题引入

    背景: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;
  • 相关阅读:
    Codeforces 706B Interesting drink
    hdu 1937 Finding Seats
    poj 2502 Subway
    hdu 1495 非常可乐
    分布式的一些基础知识
    python __new__和__init__
    TCP的time_wait、close_wait状态
    TCP三次握手,四次挥手
    迭代器、生成器
    创建自定义JSR303的验证约束(Creating custom constraints)
  • 原文地址:https://www.cnblogs.com/guanghe/p/11362152.html
Copyright © 2020-2023  润新知