为什么这段代码要编译?
Object[] object = new String[5][5];
我的意思是,如果我创建的数组对象的维度与引用变量中指定的不同,我为什么要这样做呢?
这不能编译:
String[] strings = new String[5][5];
这是怎么回事?
发布于 2014-01-02 16:55:24
第一个编译是因为String[]
是一个Object
。第二个没有编译,因为String
不是String[]
。
Object[] object = new String[5][5]; // Means each element is an String[] which is an Object as well.
String[] strings = new String[5][5]; // Also Means each element is an String[] which is not same as just String.
发布于 2014-01-02 16:51:42
Java中的数组是协变。对于任何类型的T1
和T2
,如果T2
派生自T1
(即T2
直接或间接扩展或实现T1
),那么T2[]
是T1[]
的一个子类型。因此,String[]
是Object[]
的子类型,您可以将String[]
类型的对象分配给Object[]
类型的变量。
注意(正如Oli Charlesworth在注释中指出的那样),协方差破坏了Java编译时类型的安全性。此代码:
Object [] o = new String[5];
o[0] = Integer.valueOf(3);
将在第二行尝试执行时在运行时生成ArrayStoreException
。所以我并不是说协变数组是一件很棒的事情,只是语言就是这样工作的。
关于第二个例子,String[]
不是String[][]
。协方差不适用,因为String[]
不是从String
派生的。然而,你可以这样做:
Object[] o = new String[5][5];
因为String[]
实际上是Object
。
发布于 2014-01-02 16:48:58
任何数组本身都是一个Object
。
因此,根据这一规则:
String[5]
是Object
。
String[5][]
是Object[]
。
String[5][]
和String[5]
也是Object
的。
当您希望强制编译器处理数组或多数组,而不是简单的Object
时,区别很重要。
对于Object
以外的所有类型,此规则不适用,然后:
String[5][5]
不是a String[]
https://stackoverflow.com/questions/20894605
复制相似问题