次のコードは私を混乱させます:
Object[] arr1 = new String[]{"a", "b", "c"};
Object[] arr2 = {"a", "b", "c"};
String[] a = (String[]) arr1; // ok
String[] b = (String[]) arr2; // ClassCastException
System.out.println(arr1.getClass().getName()); // [Ljava.lang.String;
System.out.println(arr2.getClass().getName()); // [Ljava.lang.Object;
2 つの初期化が互いに異なる理由を理解しようとしています。1 つ目は post 宣言で、2 つ目はショートカットです。2つは両方とも次のように宣言されていますObject[]
私の素朴な理解は次のとおりです。
Object[] arr2 = {"a", "b", "c"}; // is a syntax sugar of
Object[] arr2 = new Object[] {"a", "b", "c"};
したがって、 の実行時の型はarr2
にObject[]
変換できませんString[]
。
しかし、Java Array は共変であるため、ここで
事態は奇妙String[]
にObject[]
なりarr2
ます。String[]
Object[]
String[]
arr2
これに関する説明は高く評価されています。