自定义集合类时,发现了一个小细节,就随手记录了一下…

//定义一个数组,用于存储数据的容器
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");
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐