自定义集合类时,发现了一个小细节,就随手记录了一下…
//定义一个数组,用于存储数据的容器
private E[] dataArray = (E[]) new Object[10];
//定义一个变量,用于表示元素个数
private int size = 0;
public <T> T[] toArray(T[] a){
T [] arraylist = (T[]) new Object[this.size];
for (int i =0;i<size;i++){
arraylist[i] = (T) this.dataArray[i];
}
return arraylist;
}
测试代码:
List<String> list = new MyList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
String[] array = list.toArray(new String[0]);
for (String string: array){
System.out.println(string);
}
发现报错了:Exception in thread “main” java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
原因是:
-
Object 可以转 String
-
Object[ ] 不可以转为 String[ ]
解决方法:
利用反射机制生成数组
// 想要获取数组的元素类型的class -> getComponentType()
// 所有的数组都是属于Object类型
// 如果用a.getClass()只能获取数组的类型而不是元素的类型,会导致元素不匹配
Object array = Array.newInstance(a.getClass().getComponentType(),this.size);
for ( int i = 0; i < this.size; i++) {
Array.set(array,i,this.dataArray[i]);
}
return (T[])array;
// Array.set(数组对象,下标,值)
// Array.set(array,0,"aaa");
// Array.set(array,1,"bbb");
// Array.set(array,2,"bcc");