为什么我不能在Java中将Object []转换为StringBuilder []?

时间:2013-11-27 15:38:22

标签: java casting toarray

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()返回Object[],我知道它实际上是StringBuilder[],那为什么我不能投出它?

5 个答案:

答案 0 :(得分:3)

Java无法知道(在编译时Object[]中存储了哪些对象。从理论上讲,它可能包含Integer s,StringGrumpyCat s,这会使转换为StirngBuilder[]错误 - 因此java根本不允许它。

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

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

答案 1 :(得分:2)

您肯定可以将键入Object[]的变量转换为StringBuilder[]类型的变量。编译器不会抱怨,它会毫无错误地执行, IF 源引用确实引用了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 是#34;重载&#34; - 它转换简单值(如intchar)但它不转换对象引用 - 它只更改引用的声明类型。问题是ArrayList.toArray()会返回Object[]。要使Object[]进入StringBuilder[]使用System.arraycopy。

答案 2 :(得分:1)

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

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

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

而不是

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

答案 3 :(得分:0)

喜欢这个

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

答案 4 :(得分:0)

  

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

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

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

您希望能够将oa投射到StringBuilder[]吗?如果你这样做了:

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

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

oa[0] = "";   // oa[0] now contains a String; what does sba[0] contain?