ArrayList的toArray()方法为啥不利用泛型返回List的泛型类型的数组探究

简介: ArrayList的toArray()方法为啥不利用泛型返回List的泛型类型的数组探究

一、背景

有些同学提出“ArrayList的public <T> T[] toArray(T[] a) 带参数的方法支持泛型可以返回参数类型的数组,public Object[] toArray()


方法为啥不利用泛型返回List的泛型类型的数组”?这个问题。


那让我们看下源码研究一下吧。另外我将介绍一下通用解决这类问题的方法,方便大家举一反三。



二、研究

无参源码java.util.ArrayList#toArray()


  public Object[] toArray() {

       return Arrays.copyOf(elementData, size);

   }

底层函数java.util.Arrays#copyOf(T[], int)


   @SuppressWarnings("unchecked")

   public static <T> T[] copyOf(T[] original, int newLength) {

       return (T[]) copyOf(original, newLength, original.getClass());

   }

的确这里支持泛型。


但是我们看一下ArrayList真正存储对象的变量: transient Object[] elementData; 它的类型为Object数组。


因此从源码来看,返回值必然是Object数组了。



为啥不给转成E[] 这样呢?


一方面ArrayList真正存储对象的变量: transient Object[] elementData;


另外一方面创建ArrayList的时候,并不一定指定泛型类型的。


因此java.util.ArrayList#toArray()怎么搞?


 @Test

   public void test2() {

       ArrayList arrayList = new ArrayList();

       int random = RandomUtils.nextInt(3, MAX_LENGTH);

       log.debug("随机数-->{}", random);

       for (int i = 0; i < random; i++) {

           arrayList.add(i);

       }

       arrayList.add("String");

       Object[] objects = arrayList.toArray();

       log.debug("结果:{}", JSON.toJSONString(objects));

   }

总不能判断有泛型返回E[] 无泛型返回Object[]吧?


如果一个接口可能返回String,也可能返回Integer,那么返回值类型是不是应该定义为Object?


那么这个问题应该就明了。


三、类似的问题

正如前面说的:


(1)如果一个接口可能返回String,也可能返回Integer,那么返回值类型是不是应该定义为Object?


(2)这点又让我想到了fastjson的json反序列化时调用泛型的函数来转成对象。


com.alibaba.fastjson.JSON#parseObject(java.lang.String)


public static JSONObject parseObject(String text) {

       Object obj = parse(text);

       if (obj instanceof JSONObject) {

           return (JSONObject)obj;

       } else {

           try {

               return (JSONObject)toJSON(obj);

           } catch (RuntimeException var3) {

               throw new JSONException("can not cast to JSONObject.", var3);

           }

       }

   }

然后带类型的com.alibaba.fastjson.JSON#parseObject(java.lang.String, java.lang.Class<T>)


public static <T> T parseObject(String text, Class<T> clazz) {

       return parseObject(text, clazz);

   }

使用时:




一个是无类型参数,一个是有类型参数,有些类似。



四、怎么解决这类问题?

像这种问题还有很多很多,其实最关键的是勇于去扒源码,并结合其注释,再不行去找官方文档。


这三点可以解决绝大多数这类问题。


另外学习的时候多找共性,多类比学习,学的更快一些。


另外学习某个知识点最好自己本地多demo,这点可以参考《几个本地搭建练习项目来学习的小技巧分享》。



创作不易,如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。


另外欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。


https://t.zsxq.com/Z3bAiea  申请时标注来自CSDN。


 

————————————————

版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w605283073/article/details/92251503

相关文章
|
12天前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
23天前
|
消息中间件 存储 监控
redis 的List类型 实现 排行榜
【10月更文挑战第8天】
36 2
|
1月前
|
设计模式 安全 容器
数据结构第一篇【探究List和ArrayList之间的奥秘 】
数据结构第一篇【探究List和ArrayList之间的奥秘 】
22 5
|
1月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
24 3
|
3月前
|
XML Java API
List与String相互转化方法汇总
本文汇总了List与String相互转化的多种方法,包括使用`String.join()`、`StringBuilder`、Java 8的Stream API、Apache Commons Lang3的`StringUtils.join()`以及Guava的`Joiner.on()`方法实现List转String;同时介绍了使用`split()`方法、正则表达式、Apache Commons Lang3的`StringUtils.split()`及Guava的`Splitter.on()`方法实现String转List。
List与String相互转化方法汇总
|
3月前
|
Java
用JAVA架建List集合为树形结构的代码方法
这段代码定义了一个表示树形结构的 `Node` 类和一个用于构建树形结构的 `TreeController`。`Node` 类包含基本属性如 `id`、`pid`、`name` 和 `type`,以及子节点列表 `children`。`TreeController` 包含初始化节点列表并将其转换为树形结构的方法。通过过滤和分组操作实现树形结构的构建。详情可见:[代码示例链接1](http://www.zidongmutanji.com/zsjx/43551.html),[代码效果参考链接2](https://www.257342.com/sitemap/post.html)。
40 5
|
3月前
|
SQL 机器学习/深度学习 算法
【python】python指南(五):静态类型注解之List
【python】python指南(五):静态类型注解之List
39 0
【python】python指南(五):静态类型注解之List
|
4月前
|
前端开发 Java 项目管理
List.of 问题之使用List.of方法为什么会引发前端解析失败的问题,如何解决
List.of 问题之使用List.of方法为什么会引发前端解析失败的问题,如何解决
|
4月前
|
XML Java API
List与String相互转化的方法有哪些
摘要:本文概述了Java中List转换为String及反之的多种策略。使用`String.join()`可简洁地连接List元素;`StringBuilder`提供灵活控制;Java 8 Stream API收集器简化操作;Apache Commons Lang3的`StringUtils.join()`和Guava的`Joiner.on()`支持外部库的高效转换。
|
4月前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
下一篇
无影云桌面