繁体   English   中英

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

[英]How to convert object[] to specific type array

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

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

我怎样才能在Java中实现这一目标?

其他答案显示了如果你真的需要转换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]);

如果每一个元素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是真实类型而不是通用参数时才有效!

你不能通过演员来做到这一点。 您必须复制数据。

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

@Jon Skeet的答案是正确的,但这里是Intellij IDEA检查信息的一些背景:

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

在较旧的Java版本中,建议使用预先调整大小的数组,因为创建适当大小的数组所需的反射调用非常慢。 然而,由于OpenJDK 6的最新更新,这个调用是内在化的,与预先调整大小的版本相比,使得空数组版本的性能相同,有时甚至更好。 传递预先调整大小的数组对于并发或同步集合也是危险的,因为在size和toArray调用之间可能存在数据争用,如果集合在操作期间同时收缩,则可能导致数组末尾出现额外的空值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM