Следующий код меня смущает:
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;
Я пытаюсь понять, почему две инициализации отличаются друг от друга. Первый - это объявление, а второе - ярлык. Оба объявлены как 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 является точно a String[], отключение от Object[] до String[] на arr2 должно работать.
Любое объяснение этому высоко ценится.