Array和ArrayList的Clone为什么一个不用类型转换,一个要类型转换

摘要:
从上面的代码可以看出,Array的Clone()不需要类型转换,但ArrayList的Clone需要类型转换。由此可见,elementData是Object类型,original也是Object类型,通过copyOf方法返回的也是Object对象。因此,我们得出结论,ArrayList返回一个Object Object,这使得系统无法识别特定类型,因此需要进行类型转换。

Array和ArrayList的Clone为什么一个不用类型转换,一个要类型转换第1张

通过上面一段代码可以看出Array的Clone()不用进行类型转换,但ArrayList的Clone要进行类型转换。为什么会出现这种情况呢?我们来分析下源码

现在来看下Array的Clone()方法源码

Array和ArrayList的Clone为什么一个不用类型转换,一个要类型转换第2张

发现Array里没有Clone()方法,调用的都是Object里的方法

Array和ArrayList的Clone为什么一个不用类型转换,一个要类型转换第3张

这里面的除了Object并不是说Object就不遵守这个惯例,而是Object就是这个惯例的源头,它是一定遵守的,那么就可以得出结论

Array调用Clone是不用类型转换的。

那么为什么ArrayList就要呢?我们来看下ArrayList里的Clone()方法

Array和ArrayList的Clone为什么一个不用类型转换,一个要类型转换第4张

调用super的Clone方法,好像也没有问题,但问题在下面一行Arrays的copyOf()方法,我在看下copyOf()方法

 Array和ArrayList的Clone为什么一个不用类型转换,一个要类型转换第5张

发现,这里需要original的类型,那么original的类型又是什么呢?我们回到上面看clone(),original对应参数elementData对象,那么elementData是什么类型呢?

Array和ArrayList的Clone为什么一个不用类型转换,一个要类型转换第6张

通过这个可以看出,elementData是Object类型,original也是Object类型,通过copyOf方法返回的也是一个Object对象,所以我们得出结论

ArrayList返回的是一个Object对象,该Object使系统无法识别具体类型,所以要进行类型转换。

免责声明:文章转载自《Array和ArrayList的Clone为什么一个不用类型转换,一个要类型转换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java之Matcher类详解ASP公共翻页代码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

QTP的基本功能介绍

• QTP的基本功能介绍 HP QuickTest Professional 支持功能測试和回归測试自己主动化,用于每一个主要软件应用程序和环境。此解决方式使用keyword驱动的測试概念,简化了測试创建和维护过程。它使測试人员可以使用专业的捕获技术直接从应用程序屏幕中捕获流程来构建測试案例。測试专家还可通过集成的脚本和调试环境全然訪问内在測试和对象属...

PHP 设计模式 笔记与总结(5)PHP 魔术方法的使用

PHP 魔术方法的使用 ① __get/__set:将对象的属性进行接管 当访问一个不存在的对象属性时: index.php <?php define('BASEDIR',__DIR__); //定义根目录常量 include BASEDIR.'/Common/Loader.php'; spl_autoload_register('\Commo...

公司线上虚拟机大量GC导致STW和CPU飙升--抽丝剥茧定位的过程

作者: bryan31 原链接:https://www.v2ex.com/t/701513 背景 公司线上有个 tomcat 服务,里面合并部署了大概 8 个微服务,之所以没有像其他微服务那样单独部署,其目的是为了节约服务器资源,况且这 8 个服务是属于边缘服务,并发不高,就算宕机也不会影响核心业务。 因为并发不高,所以线上一共部署了 2 个 tomcat...

网络技能大赛A卷测试

  这个测试对我来言有些难度,短时间内做不了太多。首先是思路的理清,登录后的界面有好几种,而且公文的状态也有好几种。理清思路就花了一些时间 然后大致的框架做了做,然后将用户的增删改查还有公文的增删改查写了写。登录界面也完成了,不过不同角色登陆后的界面还没来得及做。主要就是功能太多,运用不熟练 数据库      bean层的基本信息 package c...

C# AS与Is

在C#中,所有的东西都是对象。因此任何常数也是一个整型对象。这里用到了as,as是C#语言里面的一个关键字。as运算符类似于类型转换,所不同的是,当转换失败时,as运算符将产生空,而不是引发异常。在形式上,这种形式的表达式:expression as type as 运算符只执行引用转换和装箱转换。as 运算符无法执行其他转换,如用户定义的转换,这类转换应...

Python的魔法函数

概要 如何定义一个类 类里通常包含什么 各个部分解释 类是怎么来的 type和object的关系 判断对象的类型 上下文管理器 类结构 #!/usr/bin/env python #-*- coding: utf-8 -*- #Author: rex.cheny #E-mail: rex.cheny@outlook.com #类名后面写(object...