请教Java中的一个强制转换小问题?(30分)

  • 主题发起人 主题发起人 Archerfl
  • 开始时间 开始时间
A

Archerfl

Unregistered / Unconfirmed
GUEST, unregistred user!
我的main主函数中的代码如下:
public static void main(java.lang.String[] args) {
Collection c = new ArrayList();
c.add("one");
c.add("two");
try {
String[] str = (String[])c.toArray();
for (int i = 0;
i < str.length;
i++)
System.out.println(str + " ==> " + str.getClass().getName());
}
catch (Exception e) {
e.printStackTrace();
}
}
很简单的一段代码。如上大家看到了,在Collection中存储的对象全部是String类型。
然后,我想通过这句:String[] str = (String[])c.toArray();
通过强制类型转换,获取
Collection中的实际类型。但是,有趣的是,这里总会出现异常,报告如下:
java.lang.ClassCastException
java.lang.Throwable()
java.lang.Exception()
java.lang.RuntimeException()
java.lang.ClassCastException()
void newpackagesix.MyClass.main(java.lang.String [])
void newpackagesix.MyClass.main(java.lang.String [])
类型转换异常,呵呵,不知道这是为什么?但是我这里存储的对象可确实是String类型的。
请各位大虾指点一二,谢!
 
c.toArray转换后是object[]数组,当然不能转换成String[]了,
 
直接赋值当然不可以,但这里是强制类型转换,而且其中的类型确实都是String型,因此我认为是完全可以的。
看如下代码片段:
public static void main(String[] args) {
try {
Object[] m = new String[2];
m[0] = "one";
m[1] = "two";
String[] n = (String[]) m;
for (int i = 0;
i < n.length;
i++)
System.out.println(n);
}
catch (Exception e) {
e.printStackTrace();
}
}
以上从Console台上输出的结果为:
one
two
说明确实可以进行强制类型转换,可是不知道为什么我所提到的问题中的例子就是不可以呢?而且更搞笑的是,假如把上面这段代码当中的前几句:
Object[] m = new String[2];
m[0] = "one";
m[1] = "two";
删掉,改为Object[] m = {"one","two"};
运行后,立刻会引来下面的报错:
java.lang.ClassCastException
java.lang.Throwable()
java.lang.Exception()
java.lang.RuntimeException()
java.lang.ClassCastException()
void newpackagesix.MyClass.main(java.lang.String [])
void newpackagesix.MyClass.main(java.lang.String [])
 呵呵,搞不懂这又是为什么呢?
 
呵呵,这样就可以了:
import java.util.*;
public class Demo
{
public static void main(String[] args)
{
Collection c = new ArrayList();
c.add("one");
c.add("two");

try
{
String[] str = (String[])c.toArray(new String[0]);//<------
//传递一个字符对象
for (int i = 0;
i < str.length;
i++)
System.out.println(str + " ==> " + str.getClass().getName());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
看了文档才知道:
Like the toArray method, this method acts as bridge between array-based and collection-based APIs. Further, this method allows precise control over the runtime type of the output array, and may, under certain circumstances, be used to save allocation costs
Suppose l is a List known to contain only strings. The following code can be used to dump the list into a newly allocated array of String
String[] x = (String[]) v.toArray(new String[0]);
Note that toArray(new Object[0]) is identical in function to toArray().
 
Object[]整体是一个对象,即使它内部每一个对象都是一个String,但不等于Object[]本身是一个String[]。
可以这样理解,Object[]相当于一个类A1,String[]相当于另一个类A2,尽管A1,A2里面的元素可以都相同,但是A1!=A2
 
多人接受答案了。
 
后退
顶部