有关java数组强制类型转换的问题

 

/**
    会报异常Exception in thread "main" java.lang.ClassCastException: java.base/[Ljava.lang.Object; cannot be cast to java.base/[Ljava.lang.String;
*/
 Object[] newArray = new Object[]{"AAA","BBB"};
 String[]q=(String[])(newArray);

为什么会报异常呢,先要理解几个概念:

1:在java中数组也是类,

2:强制类型转换成功的条件是 :被强制类型转换的实例需要是强制类型转换类型的类或者其子类。

     /**
        结果全是Object
        */
     System.out.println(new int[5].getClass().getSuperclass());
     System.out.println(new Integer[5].getClass().getSuperclass());
     System.out.println(new Object[5].getClass().getSuperclass());

3:一切类的父类是Object,数组类也不例外

4:Java 数组会记住每个元素的类型, 即创建数组时 new 表达式中使用的元素类型

    一维类数组存放的是一组连续的地址引用,因此如果是取返回的Object数组其中每一个进行强制类型转换也没问题,因为每一个含义是Object s=new String("AAA"); 底层没有问题,但Object[]new Array=new Object[]类型就定下来了是Object类型,也就只能确定newArray引用的是个Object[]类型但不知道是具体那个类型,因为要在内存开辟空间,因此强制类型转换成String[]也就出错.

同理

/*
这就没错
*/
 Object[] newArray = new String[]{"AAA","BBB"};
 String[]q=(String[])(newArray);

泛型数组的生成

public E[] toArray(Class<E> type){
    Object copy=Array.newInstance(type.class);
    System.arraycopy(elementData,0,copy,0,size);
    return (E[])copy;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值