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[]
,那为什么我不能投出它?
答案 0 :(得分:3)
Java无法知道(在编译时)Object[]
中存储了哪些对象。从理论上讲,它可能包含Integer
s,String
和GrumpyCat
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; - 它转换简单值(如int
到char
)但它不转换对象引用 - 它只更改引用的声明类型。问题是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?