第一个示例中的“objArr”是 Object[] 类型。第二个示例中的“objArr”是 String[] 类型。
而 String 扩展 Object(String 是 Object 的一种类型) String[] 不扩展 Object[](String-Array Object 不是 Object-Array 的类型)
在第一个示例中,您将 Strings 放入 Object[](Object-Array)对象并不会使其成为 String[](String-array):
Object[] objArr = {"a","b","c"};
System.out.println(objArr instanceof Object[]);//true
System.out.println(objArr instanceof String[]);//false
String[] objArr2 = {"a", "b", "c"};
System.out.println(objArr2 instanceof Object[]);//false
System.out.println(objArr2 instanceof String[]);//true
== 关于协方差
这不是我完全掌握的东西,但这是我从中得到的:
在 Java 中,数组是协变的,泛型不是。这意味着这有效:
Object[] o = new String[3];
这不会:
//ArrayList<Object> o = new ArrayList<String>(); //compile time error
此外,这有效:
function1(new String[2]);
static void function1(Object[] o) {
}
这不会:
//function2(new ArrayList<String>()); //compile time error
static void function2(ArrayList<Object> o) {
}
泛型受到这样的限制是有充分理由的,但这不是本次讨论的重点。
但是我相信这并不是真正关于协方差的讨论,而只是关于如何在 Java 中实现某些类。String[] 类型的对象也是 Object[] 类型的对象(带有所有不好的东西),因此能够这样写是正常的:
Object[] o = new String[3];
但是,由于数组的协方差,因为您可以将 String[] 视为 Object[] 并且在 Object[] 中您可以放置任何类型的类型,您可以专门将 Strings 放入对象数组中。IE你可以有这个:
Object[] o = //whatever kind of array;
o[0] = //whatever kind of instance;
然而,这并没有改变最后一个示例中的 o 是 Object[] 类型的事实,因此您不能将其强制转换为 String[]。