gpt4 book ai didi

使用类型转换的 Java 数组初始化

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:46 25 4
gpt4 key购买 nike

下面的代码让我很困惑:

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;

我试图理解为什么这两个初始化彼此不同。第一个是post declaration,第二个是shortcut。两者都声明为 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 恰好是一个 String[],从Object[]arr2 上的 String[] 应该可以工作。

非常感谢对此的任何解释。

最佳答案

因为 arr2 是一个 Object[],所以没有什么可以阻止您编写

arr2[0] = new Object();

就在你的类型转换之前,类型转换无论如何都不再有意义的情况。

由于初始化语法的工作方式,还请注意以下几点:

Object x = {"a", "b"}; // error: illegal initializer for Object
Object[] a = {"a", "b"}; //a has class [Ljava.lang.Object;
String[] b = {"a", "b"}; //b has class [Ljava.lang.String;

编译器根据您的声明确定您的数组是 Object[] 还是 String[]

关于使用类型转换的 Java 数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31700713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com