以下代码让我感到困惑:
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
对此的任何解释都非常感谢。