使用类型转换的 Java 数组初始化
2022-09-04 03:01:14
下面的代码让我感到困惑:
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数组是协变的:是的子类,并且恰好是一个,从到以后的转换应该工作。String[]
Object[]
arr2
String[]
Object[]
String[]
arr2
对此的任何解释都值得高度赞赏。