String举个例子。
String[][] strings = (String[][])new Object[10]发出ClassCastException。请解释原因。
在这方面,泛型存在一个问题:
有一个示例类:
class GenericClass<G> {
G[] value;
GenericClass(G[] value) {
// так как создать массив из G нельзя (new G[]),
// приходится делать массив из Object(ов)
this.value = (G[])new Object[value.length]; // создание нового массива из обджектов всё рушит
System.arraycopy(value, 0, this.value, 0, value.length);
// this.value = value; работает
}
}
这是有问题的代码:
GenericClass<String[]> genericClass = new GenericClass<>(
new String[][] {
new String[] {"f", "s", "t"},
new String[] {"1", "2", "3"},
new String[] {"п", "в", "т"}});
String[][] strings = genericClass.value; // ClassCastException (именно в этой строчке)
不知何故,这个问题在
ArrayList. 我不明白怎么做。通常有一个对象数组,并且一切正常。
一旦创建了对象数组,就不能将其转换为任何其他类型。
但是,当有一个地方可以从中获取特定类型时,仍然可以创建泛型数组。您将原始数组作为构造函数参数传递,您可以使用它:
更新:数组受制于与普通类型相同的转换规则 - 可以轻松提升类型,但只有当它实际上是它的实例时才转换为后代类型。
此表达式是正确的 - 已创建 String[] 实例并将其转换为祖先类型:
不正确 - 对象不是字符串,不能强制转换:
以下是正确的,创建了一个字符串数组,提升为祖先类型,然后转换回其自己的类型:
类变量G[] 的值具有一维数组类型,但该对象使用二维数组new String[][]进行初始化。
复制时:
对象类型this.value变为 Object[]String[],因此出现类强制转换异常
最好使用Arrays实用程序复制数组。