根据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
数组,而不是 String
s.
这就像做如下的事情-
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/