java 数组:java.lang.ClassCastException

代码:
package com;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test test = new Test(1);
		Test test1 = new Test(5);
		Test test2 = new Test(232);
		Test test3 = new Test(3);
		Test test4 = new Test(10);
		Test test5 = new Test(222);
		List<Test> t = new ArrayList<Test>();
		t.add(test);
		t.add(test1);
		t.add(test2);
		t.add(test3);
		t.add(test4);
		t.add(test5);
//		Test[] aa =  new Test[]{test,test1,test2,test3,test4,test5};
//		Arrays.sort(aa);
		
		Test[]  bb =  (Test[]) t.toArray();
		
		Arrays.sort(bb);
		for(Object aaa:bb){
				Test ttt = (Test) aaa;
				System.out.println(ttt.getId());
		}
	}

}

Test[]  bb =  (Test[]) t.toArray();

 此处会报错:


Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lcom.Test;
at com.Test2.main(Test2.java:31)


其实就是Object 数组不能转对象数组。


方法一:

再循环的时候强转对象。

		Object[]  bb =   t.toArray();
		
		Arrays.sort(bb);
		for(Object aaa:bb){
				Test ttt = (Test) aaa;
				System.out.println(ttt.getId());
		}


方法二:

设置数组类型即可:

		Test[]  bb =   t.toArray(new Test[0]);
		
		Arrays.sort(bb);
		for(Test aaa:bb){
				System.out.println(aaa.getId());
		}

解释:

原理是:给了一个新数组:new Test[].所以可以转换。

Open Declaration <Test> Test[] java.util.List.toArray(Test[] a)


Returns an array containing all of the elements in this list in proper sequence (from first to last element); the runtime type of the returned array is that of the specified array. If the list fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this list. 

If the list fits in the specified array with room to spare (i.e., the array has more elements than the list), the element in the array immediately following the end of the list is set to null. (This is useful in determining the length of the list only if the caller knows that the list does not contain any null elements.) 

Like the toArray() method, this method acts as bridge between array-based and collection-based APIs. Further, this method allows precise control over the runtime type of the output array, and may, under certain circumstances, be used to save allocation costs. 

Suppose x is a list known to contain only strings. The following code can be used to dump the list into a newly allocated array of String: 

     String[] y = x.toArray(new String[0]);
Note that toArray(new Object[0]) is identical in function to toArray().
Specified by: toArray(...) in Collection
Parameters:
a the array into which the elements of this list are to be stored, if it is big enough; otherwise, a new array of the same runtime type is allocated for this purpose.
Returns:
an array containing the elements of this list
Throws:
ArrayStoreException - if the runtime type of the specified array is not a supertype of the runtime type of every element in this list
NullPointerException - if the specified array is null

源码:

        public <T> T[] toArray(T[] a) {
            int size = size();
            if (a.length < size)
                return Arrays.copyOf(this.a, size,
                                     (Class<? extends T[]>) a.getClass());
            System.arraycopy(this.a, 0, a, 0, size);
            if (a.length > size)
                a[size] = null;
            return a;
        }


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值