java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

在运行时result = jedis.rpush(key, (String[])value.toArray());  报了[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;这个错后来发现是强转的问题,java中的强制类型转换只是针对单个对象的,想要偷懒将整个数组转换成另外一种类型的数组是不行的,,这和数组初始化时需要一个个来也是类似的。

与 public Object[] toArray() 的比较 
public Object[] toArray() { 
Object[] result = new Object[size]; 
System.arraycopy(elementData, 0, result, 0, size); 
return result; 
    } 

从源码中可以看出它仅能返回 Object[]类型的,相当于toArray(new Object[0]) 注意:数组不能强制转换 

不带参数的toArray方法,是构造的一个Object数组,然后进行数据拷贝,此时进行转型就会产生ClassCastException

String[] tt =(String[]) list.toArray(new String[0]);
这段代码是没问题的,但我们看到String[] tt =(String[]) list.toArray(new String[0]) 中的参数很奇怪,然而去掉这个参数new String[0]却在运行时报错。。。该容器中的元素已经用泛型限制了,那里面的元素就应该被当作泛型类型的来看了,然而在目前的java中却不是的,当直接String[] tt =(String[]) list.toArray()时,运行报错。

处理方式如下面代码:
String [] st = (String []) list.toArray(newString[list.size()]);  

以下是其他博友给的解决方案 记录下

解决方案. Solutions

  因此在使用toArray的时候可以参考以下三种方式

  1. Long[] l = new Long[<total size>];

     list.toArray(l);

  2. Long[] l = (Long[]) list.toArray(new Long[0]);

  3. Long[] a = new Long[<total size>];

      Long[] l = (Long[]) list.toArray(a);


1).参数指定空数组,节省空间 
String[] y = x.toArray(new String[0]); 
2).指定大数组参数浪费时间,采用反射机制 
String[] y = x.toArray(new String[100]);  //假设数组size大于100 
3).姑且认为最好的 
String[] y = x.toArray(new String[x.size()]); 


以下代码会出现ClassCastException 
List list = new ArrayList();   
list.add(new Long(1)); 
list.add(new Long(2));   
list.add(new Long(3)); 
list.add(new Long(4));   
Long[] l = (Long[])list.toArray();//这个语句会出现ClassCastException 

发布了164 篇原创文章 · 获赞 38 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/corleone_4ever/article/details/104690394