2
ArrayList<StringBuilder> al = new ArrayList<>(
                              Arrays.asList(new StringBuilder[]{
                                  new StringBuilder("Oracle"), 
                                  new StringBuilder("Java"), 
                                  new StringBuilder("Sun"), 
                                  new StringBuilder("DataBase")}));

StringBuilder[] al2array = (StringBuilder[]) al.toArray();

如果al.toArray()返回 anObject[]我知道它实际上是 a StringBuilder[],那么为什么我不能转换它?

4

5 回答 5

3

Java 无法知道(在编译时)哪些对象存储在Object[]. 从理论上讲,它可以包含Integers、Strings 和GrumpyCats,这会使强制转换StirngBuilder[]错误 - 所以 java 根本不允许它。

但是,您可以使用覆盖toArray(StringBuilder[])来安全地执行此操作:

StringBuilder[] al2array = al.toArray(new StringBuilder[al.size]);
于 2013-11-27T15:42:27.893 回答
2

您当然可以将类型为 as 的变量强制转换为Object[]类型为的变量StringBuilder[]如果源引用确实引用了StringBuilder[].

public class ArrayCastTest {
    public static void main(String[] argv) {
        Object[] objArray;
        StringBuilder[] sbArray;
        objArray = getArray();
        sbArray = (StringBuilder[]) objArray;
        System.out.println(sbArray.toString());
    }

    public static Object[] getArray() {
        return new StringBuilder[5];
    }
}

这执行没有错误:

C:\JavaTools>javac ArrayCastTest.java

C:\JavaTools>java ArrayCastTest
[Ljava.lang.StringBuilder;@76f4da6d

C:\JavaTools>

要理解的重要一点是cast是“重载的”——它转换简单的值(如intto char)但它不转换对象引用——它只改变引用的声明类型。问题是ArrayList.toArray()返回一个Object[]. 让您Object[]使用StringBuilder[]System.arraycopy。

于 2013-11-27T16:20:55.030 回答
1

试试这个,即使用重载方法toArray(T[] a),因为toArray返回一个 Object[] 并且你不能将它向下转换为StringBuilder[]. 原因是Java 不允许它像这样进行转换,即Object 的数组是由创建的toArray(),并且您不能仅通过转换将Object 转换为DataObject。

所以你可以像这样使用覆盖toArray(StringBuilder[]): -

StringBuilder[] al2array =al.toArray(new StringBuilder[al.size()]);

代替

StringBuilder[] al2array = (StringBuilder[]) al.toArray();
于 2013-11-27T15:41:22.497 回答
0

这样做

StringBuilder[] al2array =al.toArray(new StringBuilder[al.size()]);
于 2013-11-27T15:40:46.993 回答
0

如果 al.toArray() 返回一个我知道它实际上是 StringBuilder[] 的 Object[],那么为什么我不能转换它呢?

因为它实际上不是一个StringBuilder[]- 它是一个Object[]包含(仅)StringBuilder实例。考虑一下:

Object[] oa = new Object[2];
oa[0] = new StringBuilder();
oa[1] = new StringBuilder();

你希望能够投到oaStringBuilder[]?如果你这样做了:

StringBuilder[] sba = (StringBuilder []) oa;

如果你这样做会发生什么:

oa[0] = "";   // oa[0] now contains a String; what does sba[0] contain?
于 2013-11-27T16:05:20.013 回答