首页 > 编程语言 >copyOfRange方法--源码分析

copyOfRange方法--源码分析

时间:2022-10-22 16:31:39浏览次数:75  
标签:-- Object copyOfRange newType int 源码 数组 original Class

首先看看Arrays.copyOfRange泛型方法:

public static <T> T[] copyOfRange(T[] original, int from, int to) {
return copyOfRange(original, from, to, (Class<? extends T[]>) original.getClass());
}

里面实际调用的是更加通用的泛型方法copyOfRange(),那么继续往下看

public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
@SuppressWarnings("unchecked") //所有类都是Object类的子类
T[] copy = ((Object)newType == (Object)Object[].class) //将newType强转为Object才能通过编译,进行比较
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));//防止了to大于原数组长度的情况
return copy;
}

分析输入的参数:

U[] original ,原数组(可传入任意类型数组)

int from ,原数组的要复制的起始位置

int to ,原数组的要复制的终点位置

Class<? extends T[]> newType  ,新数组的类型

“ Class<? extends T[]> ” 这里使用递归泛型,目的是使newType一定是数组类型才能编译成功

(对递归泛型的概念不清楚的朋友可以看看我写过的一篇文章)​建造者模式-具有递归类型参数的泛型类型(Effective-Java) ​

重点:源码中的一个判断条件:(Object)newType == (Object)Object[].class

1.如果newType是Object[]类型的,那么直接使要返回的copy数组为new出的Object[newLength]

2.如果不等,而Java中我们是无法直接new出T[](泛型数组)的,因此通过反射去获取。数组特有的getComponentType()方法,可得到数组元素的类型

过程中,出现的 数组类型 与 数组元素类型 是两种class对象
public static void main(String[] args) throws ClassNotFoundException {

Class<?> aClass = Class.forName("java.lang.Object");

boolean flag1 = aClass == Object[].class;
boolean flag2 = aClass == Object[].class.getComponentType();
boolean flag3 = (Class<? extends Object[]>) aClass == Object[].class;

System.out.println(flag1);//false
System.out.println(flag2);//true
System.out.println(flag3);//false
System.out.println((Class<? extends Object[]>) aClass.getComponentType());//null
}



标签:--,Object,copyOfRange,newType,int,源码,数组,original,Class
From: https://blog.51cto.com/u_15534346/5786010

相关文章

  • #yyds干货盘点# LeetCode 腾讯精选练习 50 题:整数反转
    题目:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围 [−231, 231 −1],就返回0。假设环境不允许存......
  • Python教程Day07-集合
    集合一、创建集合创建集合使用​​{}​​​或​​set()​​​,但是如果要创建空集合只能使用​​set()​​​,因为​​{}​​用来创建空字典。s1={10,20,30,40,50}pri......
  • shell基础
    https://mp.weixin.qq.com/s?__biz=MzI2OTA3NTk3Ng==&mid=2649284689&idx=1&sn=6942854dcbefde0f5f2fe563bbfb8888&chksm=f2f99336c58e1a2053fa294af14efd41a4a7c64d219ca0......
  • 文件查看lsof
    https://mp.weixin.qq.com/s?__biz=MzI2OTA3NTk3Ng==&mid=2649284482&idx=1&sn=ae99d96fab26733cb1a208750f3dd5e8&chksm=f2f9ace5c58e25f397335937c6771ddc2f985783c787c6......
  • 代码复现:Copy-Paste 数据增强for语义分割
    一、前言前些天分享了一篇谷歌的数据增强论文,解读在这:https://www.cnblogs.com/tangjielin/p/16812816.html。可能由于方法比较简单,官方没有开源代码,于是,我自己尝试在语......
  • 网络查看netstat
    https://mp.weixin.qq.com/s?__biz=MzI2OTA3NTk3Ng==&mid=2649284776&idx=1&sn=17774bdfe5f8e7296f107c2af60e2b31&chksm=f2f993cfc58e1ad9ba32071d1f3e5060400da41d4ed593......
  • ps命令
    https://mp.weixin.qq.com/s?__biz=MzI2OTA3NTk3Ng==&mid=2649283839&idx=1&sn=62bb18d464ba24c660f69dc1800e880b&chksm=f2f9af98c58e268e12cae70085511bb58ea0955d74e7f6......
  • 查看系统状态
    https://mp.weixin.qq.com/s?__biz=MzI2OTA3NTk3Ng==&mid=2649283877&idx=1&sn=0ee514b242c1134366f9c4f02ea8d781&chksm=f2f9ae42c58e27547e9025d93820482c0bbe82189ce88e......
  • 开发调试ldd
    https://mp.weixin.qq.com/s?__biz=MzI2OTA3NTk3Ng==&mid=2649283850&idx=1&sn=6a23eebca91d9071f3963c1e5a90ab28&chksm=f2f9ae6dc58e277b2899bd67d475c6d8928bb5d7726558......
  • [RxJS] Extract common operator logic into standalone function
    /**From*/click$.pipe(mergeMapTo(throwError({status:400,message:'Servererror'}).pipe(retryWhen(attempts=>{returnatt......