最初の例の「objArr」は Object[] 型です。2 番目の例の「objArr」は String[] 型です。
String は Object を拡張しますが (String は Object の型です)、String[] は Object[] を拡張しません (String-Array Object は Object-Array の型ではありません)。
最初の例で String を 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[] にはどのような種類でも配置できるため、具体的には String をオブジェクト配列に配置できます。IEあなたはこれを持つことができます:
Object[] o = //whatever kind of array;
o[0] = //whatever kind of instance;
ただし、これは、最後の例の o が Object[] 型であるという事実を変更しないため、それを String[] にキャストすることはできません。