为什么这段代码可以编译?
所以这里发生了什么?
Object[] object = new String[5][5];
我的意思是,如果我创建的数组对象的维度与引用变量中指定的维度不同,那么为什么我还能这样做呢?
这段代码无法编译:
String[] strings = new String[5][5];
所以这里发生了什么?
Object[] object = new String[5][5];
我的意思是,如果我创建的数组对象的维度与引用变量中指定的维度不同,那么为什么我还能这样做呢?
这段代码无法编译:
String[] strings = new String[5][5];
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
。String[] strings = new String[5]; Object[] objs = strings; objs[0] = new Integer(42);
... - Oliver CharlesworthString[]
是一个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.
Object
。String[5]
是一个 Object
。String[5][]
是一个 Object[]
。String[5][]
和 String[5]
也是 Object
。Object
时,这种区别很重要。Object
之外的所有类型,这个规则不适用,然后:String[5][5]
不是一个 String[]
。对于第一段代码,您将无法使用字符串方法
object[0][0].substring(1);//error
//correct to use string methods
strings[0][0].substring(1);
strings[0][0].chartAt(0);
但是第二段代码可以使用字符串方法。
2- 第二段代码必须如下:
String[][] strings = new String[5][5];