/**
会报异常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;
}