文档章节

集合的toArray方法产生的Object[]数组转换失败

乒乓狂魔
 乒乓狂魔
发布于 2015/02/07 10:45
字数 505
阅读 261
收藏 1
点赞 1
评论 0
最近遇见一个问题,即调用一个集合(只存放类A的对象)的toArray()方法变成Object[]数组,最后将它转换成A[]时抛出类型转换异常。不知道为什么不能转换成功。

最后了解到,集合的toArray方法有两个,一种就是Object[] toArray(),另一种就是T[] toArray(T[] a),前一种没有指定数组的类型为Object,后一种指定数组的类型为T。所以为了避免类型转换失败,在使用时尽量使用后一种,指明你所想要产生的数组类型。

详细看下他们的源代码,其实也很简单(以Vector为例):

public synchronized Object[] toArray() {
        //将elementData的数据全部复制到Object数组中
        return Arrays.copyOf(elementData, elementCount);
 }

再看下Arrays.copyOf(elementData, elementCount):
public static <T> T[] copyOf(T[] original, int newLength) {
        return (T[]) copyOf(original, newLength, original.getClass());
    }
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

如果直接调用toArray()方法,默认产生的T[] copy则是Object[]类型的,把数据全部存进Object数组中。
如果调用的是T[] toArray(T[] a),如下:

public synchronized <T> T[] toArray(T[] a) {
        if (a.length < elementCount)
            //将elementData的全部数据复制到a.getClass()所代表的数组类型中
            return (T[]) Arrays.copyOf(elementData, elementCount, a.getClass());

        //从elementData的0偏移量开始,a也是从0偏移量开始,复制elementCount个数据,
        System.arraycopy(elementData, 0, a, 0, elementCount);

        //超出的部分置为null
        if (a.length > elementCount)
            a[elementCount] = null;

        return a;
    }

会采用你所传递进来的数组类型作为返回的数组类型,当你所传递进来的数组length 小于集合中所包含的数据个数时,直接新建一个数组返回全部数据。当你所传递进来的数组length大于集合所包含的个数时,多余的位置填充null。

若想转载请注明出处
作者:乒乓狂魔

© 著作权归作者所有

共有 人打赏支持
乒乓狂魔
粉丝 979
博文 105
码字总数 271356
作品 0
长宁
程序员
Java中集合与数组之间的转化

一、集合转化为数组: 采用集合.toArray()方法,根据转化为数组的类型又可以分为: 1、转化为Object[]类型数组 比如:Object[] listArray = list.toArray(); Object[] setArray = set.toArra...

Erichkko
2015/09/18
281
0
ArrayList类的ToArray()使用注意点

ArrayList类有个ToArray方法,用来将ArrayList的元素复制到新Object数组中,这里有讲究的地方! 使用 ArrayList类的ToArray方法时并未指定任何参数,则无参数的ToArray方法将会返回一个类型为...

fjabing
2014/02/14
0
0
Java中list转成数组的方法 java.util.List.toArray()

Java中list转成数组,有一个方法 java.util.List.toArray(),他在使用中常遇到的几种情况如下: 1.错误的方式 private void onButtonListToArrayClick() { // Array--->List String[] strArr...

YuanyuanL
2015/10/19
269
0
Java编程思想: 持有对象

泛型和类型安全的容器 使用Java SE5之前存在的一个问题是: 编译器允许你向容器中插入不正确的类型. 考虑下例: 1. 由于ArrayList保存的是Object类型, 所以可以存储Apple, Orange类型. 2. 在具...

fzyz_sb
2016/07/23
17
0
Java 集合框架_开篇

Java 集合框架系列 Java 集合框架开篇 Java 集合框架List Java 集合框架ArrayList Java 集合框架LinkedList Java有三大工具类框架非常值得我们学习,java集合框架,java并发框架,以及java ...

wo883721
2017/12/20
0
0
jdk源码阅读之 java.util.Collection

作用 还是一个泛型接口, 主要规范了集合操作的一些必要方法, 许多方法都接受一个,而不是去接受, 等参数来增强方法实用性 还继承自 表示允许被迭代 子类有: 主要方法 查询类方法列表 返回集合...

0x0001
2016/12/25
12
0
Java中List转换为数组,数组转List

今天写代码遇到一个奇怪的问题,具体代码不贴出了,写一个简化的版本。如下: ArrayList<String> list=new ArrayList<String>(); String strings[]=(String [])list.toArray(); 这样写代码个...

Idiot_s_Sky
2014/02/05
0
0
Java中List转换为数组,数组转List

今天写代码遇到一个奇怪的问题,具体代码不贴出了,写一个简化的版本。如下: ArrayList<String> list=new ArrayList<String>(); String strings[]=(String [])list.toArray(); 这样写代码个...

JayPark不作死
2014/11/24
0
0
Java 基础(三)集合源码解析 Collection

前面我们讲到了集合的定义以及集合的 Iterator。我们知道集合分为 Collection和 Map,今天我们的重点是学习 Collection。 什么是集合 我们再来回顾一下集合解决了什么问题:在编译期间不知道...

diamond_lin
2017/09/25
0
0
Java集合框架_四_List接口

一、List? Collection接口往下继承产生了三个接口,它们有各自的特点,本文要学习的是具有“有序可重复”特点的 List 接口,它也叫做列表。 在列表中,这使得我们能够精确定位需要进行操作的...

mrbinary
2014/01/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

gcviewer的使用

1、没有安装git软件 在编译打包GCViewer的过程中,不能执行git命令,错误信息如下: [ERROR] Failed to execute goal org.codehaus.mojo:buildnumber-maven-plugin:1.4:create (create-build...

刀锋
15分钟前
1
0
Android LogUtil 日志优化 调试的时候打印 点击跳转

打印日志的时候,可以点击跳转 LogUtil.java public class LogUtil { private static boolean IS_DEBUG = BuildConfig.DEBUG; public static void i(String tag, String message) {......

Jay_kyzg
25分钟前
0
0
人工智能你必须掌握的32个算法(二)归并排序算法

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子...

木头释然
28分钟前
0
0
第十四章NFS服务搭建与配置

14.1 NFS介绍 NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netap...

Linux学习笔记
51分钟前
1
0
流利阅读笔记27-20180716待学习

生了娃照样能打,两位母亲温网会师 Lala 2018-07-16 1.今日导读 现今在生儿育女后回归事业的母亲们已经非常多见,但是很少有人想到,以高强度运动与竞争激烈为特色的竞技体育项目也会有 work...

aibinxiao
52分钟前
6
0
Guava 源码分析(Cache 原理【二阶段】)

前言 在上文「Guava 源码分析(Cache 原理)」中分析了 Guava Cache 的相关原理。 文末提到了回收机制、移除时间通知等内容,许多朋友也挺感兴趣,这次就这两个内容再来分析分析。 在开始之前...

crossoverJie
今天
0
0
OSChina 周一乱弹 —— 如果是你喜欢的女同学找你借钱

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享Michael Learns To Rock的单曲《Fairy Tale》 《Fairy Tale》- Michael Learns To Rock 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
今天
842
20
NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部