我认为我不能转换以下内容:
List<B> c = new ArrayList<B>();
c.add(***);
object[] a = c.toArray();
B[] b = (B[])a; //How to cast a back to B[]?
如何在Java中实现这一目标?
答案 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调用,这可能会导致 数组,如果在操作过程中同时缩小了集合。