如何将object []转换为特定类型数组

时间:2011-09-21 10:58:13

标签: java

我认为我不能转换以下内容:

List<B> c = new ArrayList<B>();
c.add(***);
object[] a = c.toArray();
B[] b = (B[])a; //How to cast a back to B[]?

如何在Java中实现这一目标?

4 个答案:

答案 0 :(得分:9)

其他答案显示如果真的需要转换Object[]该怎么办 - 但是有更好的方法。将代码更改为以:

开头
List<B> c = new ArrayList<B>();
c.add(***);
B[] b = c.toArray(new B[c.size()]);

或者:

List<B> c = new ArrayList<B>();
c.add(***);
B[] b = c.toArray(new B[0]);

答案 1 :(得分:4)

如果a的每个元素都是B类型,那么您有两个选项(如果没有,您需要先解释一下发生了什么):

B[] bArray;
if(a instanceof B[]){
    // a is actually of type B[], so we'll cast it
    bArray = (B[]) a;
}else{
    // a is of type Object[], so we'll create a new array and copy the values
    bArray = Array.newInstance(B.class, a.length);
    System.arraycopy(a, 0, bArray, 0, a.length);
}

此外,只有当B是真实类型而不是通用参数时,这才有效!

答案 2 :(得分:1)

你无法通过演员表达到这一点。您必须复制数据。

B[] b = new B[a.length];
for (int i=0; i<a.length; i++){
   b[i] = (B)a[i];
}

答案 3 :(得分:0)

@Jon Skeet的answer是正确的,但这是Intellij IDEA检查信息中的一些上下文:

  

有两种样式可以将集合转换为数组:   预定大小的数组(例如c.toArray(new String [c.size()]))或使用   空数组(如c.toArray(new String [0])。

     

在较早的Java版本中,建议使用预大小数组,因为   创建适当大小的数组所必需的反射调用   很慢但是,由于OpenJDK 6的更新较晚,因此此调用是   内在的,使空数组版本的性能   与预先确定的版本相比,有时甚至更好。   同样,传递预大小的数组对于并发或   同步收集,因为大小之间可能发生数据竞争   和toArray调用,这可能会导致   数组,如果在操作过程中同时缩小了集合。