Следующий код меня смущает:
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
должно работать.
Любое объяснение этому высоко ценится.