以下代码让我感到困惑:
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 是 covariant:
String[]的子类,Object[]并且arr2正是 a的子类,从toString[]转换回on应该可以工作。Object[]String[]arr2
对此的任何解释都非常感谢。