现在的位置: 首页 > 综合 > 正文

JAVA学习笔记 — ”诡异“的List和Array转换

2013年01月11日 ⁄ 综合 ⁄ 共 1398字 ⁄ 字号 评论关闭

先看看List和Array怎样转换。

 

List --> Array :

Collection这个接口提供了一个 toArray()方法,所以要将任何一个Collection的实现转换为Array,调用这个函数就好了:

 

Array --> List :

Arrays这个类提供了一个 asList()的函数:

 

貌似到这里,问题就解决了。可是如果确实如此的话,我也不用写这篇blog了。

 

问题出在asList()这个函数上,这是它的完整定义:

    public static <T> List<T> asList(T... a)

但其实,它返回的不是一个”完整的“List对象,而是一个视图(View)。这意味着什么呢?在上面的示例代码中,如果我们改变array中的元素,那么list中的元素也会相应的改变。实际上,array和list指向的是同一组数据。

但是,toArray()这个函数又不存在这个问题。toArray()返回的是一个”safe“的数组。意思就是toArray()会将List中的数据通过值传递的方式拷贝到新的数组中,List中的数据和新创建的数组中的数据不存在引用。在第一组示例代码中,如果改变list中的元素,不会影响到array中的数据。

很有趣吧,看上去是一个双向的转换,但其实asList()和toArray()在语义上有着很大的差别。

 

问题还没完呢,接着再详细讨论一下toArray():

    public Object[] toArray()

可以看出,toArray返回的是一个类型为Object[]的对象。现在再来看一段代码:

当执行到第三句的时候,会抛出异常”java.lang.ClassCastException“。why?
我没有找到很正式的答案,可以简单的认为数组不支持向下转型。或者可以这样认为,只有当一个父类的引用指向子类对象时,这个父类的引用才能够向下转换成子类引用。而objArray的类型就是Object,intArray的类型是Integer,这两都是实例对象,你不能够将一个Object的对象转换为Integer的对象。

 

难道没有一个办法能够将list.toArray()返回的结果转换成对应类型的数据了吗?

当然有。

最简单的办法:

呵呵,看懂了这段代码吗,其实就是调用Collection接口提供的另外一个函数:

public Object[] toArray(Object[] a)

具体的用法看JAVADoc吧。

 

 

 

 

抱歉!评论已关闭.