我不明白解析时括号[]
在这段代码中到底做了什么Integer[]
new Objects
private Integer data[]=(Integer[]) new Object[10];//works fine
private Integer data[]=(Integer) new Object[10];//error
private Integer data[]=(Integer) new Object[10]; //I'm a C programmer :)!
等同于:
private Integer[] data=(Integer) new Object[10];
现在您可以更好地看到这data
是一个s数组。Integer
data
是 type ,如果左侧变量的类型是Integer[]
,则不能new Object[10];
转换为。Integer
Integer[]
我将为您阅读代码:
第 1 行:
new Object[10]
- 为 Object 实例的 10 个引用创建一个新数组。完成后,引用全部为空。(Integer []) ...
- 告诉编译器它应该假定 Object 引用数组实际上是 Integer 引用数组,即对 Integer 实例的引用数组。private Integer data [] = ...
- 将我们刚刚创建的数组保存在一个名为 data 的私有引用变量中,并假设 data 引用一个整数数组。第 2 行:
(Integer)
- 告诉编译器对 Object 实例数组进行一个整数引用。那是做不到的,因为没有办法将一个数组只变成一个对象。总结一下:
X []中的括号表示对 X 的引用数组。
并且(Y) foo读取假定 foo 实际上是类型 Y 的实例。
对象数组必须强制转换为Integer[]
不Integer
您正在尝试data
在第一种情况下创建数组实例。但是,在第二种情况下,您试图将数组分配给Integer
而它期望它是一个数组。
变量的类型data
是Integer[]
(整数数组)。如果您使用声明数组的传统样式会更清楚:
private Integer[] data = ...
因此,第一行将表达式转换为变量 ( Integer[]
) 的类型,而第二行将其转换为Integer
,这不是 的类型data
,因此编译错误。
请注意,第二行虽然可以编译,但没有多大意义。你应该简单地使用
private Integer[] data = new Integer[10];
它将对象数组转换为整数数组以允许分配。