Java 数组窄转换规则

标签 java reflection casting

根据JLS 7,5.1.6 Narrowing Reference Conversion

• From any array type SC[] to any array type TC[], provided that SC and TC are reference types and there is a narrowing reference conversion from SC to TC.

Object[] objArr = {"a","b","c"};
String[] strArr = (String[])objArr; // ClassCastException

在上面的例子中,objArr 和 strArr 都是引用类型,并且存在从 Object 到 String 的窄引用转换。

Object obj = "a";
String str = (String)obj;

但以下代码可以正常工作:

Object[] objArr = (Object[])java.lang.reflect.Array.newInstance(String.class, 3);
String[] strArr = (String[])objArr;

我想问一下java用来做转换的规则。 据我所知,这两个示例之间的区别在于,在第一个示例中,objArr 是一个对象数组,其组件类型为 Object。第二个是一个包含字符串类型组件的对象数组。

请注意,我不是在问如何进行转换,也不要告诉我如何使用 Arrays.copyOf 或其他库进行转换。

最佳答案

Object[] objArr = {"a","b","c"};
String[] strArr = (String[])objArr;

问题是 {"a","b","c"} 这是一个 Object 数组,而不是 Strings.

这就像做如下的事情-

Object obj = new Object();
String str = (String) obj; //ClassCastException

以下情况也不异常(exception)-

Object[] objArr = new String[] {"a","b","c"}; //Which is the case when you are using reflection
String[] strArr = (String[])objArr; //No exception

这就像做如下的事情-

Object obj = new String();
String str = (String) obj;

关于Java 数组窄转换规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12693072/

相关文章:

angular - 无法使用 Angular Firebase 的界面

java - 如何在 2d ArrayList 上调用 .get()

java - 同时具有java和scala的maven项目

java - 在 openssl 的 native 代码中使用来自 java 的私钥

C# 对象到数组

sql-server - 无法使用CAST功能

java - Android - 如何测试 onResume()?

json - 是否可以动态设置 json.Unmarshal 的输出?

java - 在运行时构造一个函数

c++ - (类型)值和类型(值)有什么区别?