首页 新闻 会员 周边

java LinkedList类库中的方法ToArray()强制类型转换问题?

0
[已解决问题] 解决于 2012-10-28 10:35

今天在练习java集合LinkedList类库中的方法是遇到一个很奇怪的问题,请看下面代码:

LinkedList<String> llString=new LinkedList<String>();
        String[] s=llString.toArray();

Myeclipse报错:Type mismatch: cannot convert from Object[] to String[]

于是我进行了强制类型转换,请看代码:

LinkedList<String> llString=new LinkedList<String>();
        String[] s=(String[]) llString.toArray();

编译器不报错了!

帮助文档中对LinkedList的ToArray()方法是这么描述的:

public <T> T[] toArray(T[] a)
返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组;返回数组的运行时类型为指定数组的类型。如果指定数组能容纳列表,则在其中返回该列表。否则,分配具有指定数组的运行时类型和此列表大小的新数组。

如果指定数组能容纳列表,并有剩余空间(即数组比列表元素多),则紧跟在列表末尾的数组元素会被设置为 null。(只有 在调用者知道列表不包含任何 null 元素时,才可使用此方法来确定列表的长度。)

toArray() 方法一样,此方法充当基于数组的 API 与基于 collection 的 API 之间的桥梁。更进一步说,此方法允许对输出数组的运行时类型上进行精确控制,在某些情况下,可以用来节省分配开销。

假定 x 是只包含字符串的一个已知列表。以下代码可用来将该列表转储到一个新分配的 String 数组:

     String[] y = x.toArray(new String[0]);
注意,toArray(new Object[0])toArray() 在功能上是相同的。
上面描述中也举例子, String[] y = x.toArray(new String[0]);没有进行强制转换类型。
我的疑问:上面我在声明  llString时,已经使用了范型来防止进行类型转换,为何在ToArray()前还要进行强制类型换换呢?这样范型的作用不久丢失了吗?
谢谢!
iGeneral的主页 iGeneral | 初学一级 | 园豆:191
提问于:2012-08-26 17:21
< >
分享
最佳答案
-1
LinkedList<String> llStrings = new LinkedList<String>();
        for(int i=0;i<100;i++){
            llStrings.add(""+i);
        }
        String[] arry = new String[llStrings.size()];
        arry = llStrings.toArray(arry);
        System.out.println(arry.length);

这样就可以了,它需要指定要转换的类型

toArray(T[] a) 和toArray()是不一样的。
奖励园豆:5
Youkes | 菜鸟二级 |园豆:222 | 2012-10-27 21:33

谢谢你,知道了要这么做,但还是不明白为什么,不过没事,以后我会慢慢明白的!

iGeneral | 园豆:191 (初学一级) | 2012-10-28 10:35
其他回答(2)
0
LinkedList。toArray()返回的是将LinkedList内部维护的数组拷贝一份返回,客户端可以任意修改。这样确保了内部的数据的安全性。
爱吃皮皮虾 | 园豆:54 (初学一级) | 2012-08-26 18:05
是的,这个我知道,但是需要类型转换的本质原因是什么呢?谢谢
支持(0) 反对(0) iGeneral | 园豆:191 (初学一级) | 2012-08-26 23:26
0

泛型在编译以后被擦除,返回的是Obeject[]的类型,当然要强制转换了!

淡蓝涩 | 园豆:202 (菜鸟二级) | 2012-08-26 20:36
范型编译时为什么会被擦除呢?没听说过。
支持(0) 反对(0) iGeneral | 园豆:191 (初学一级) | 2012-08-26 23:25

@igeneral: 

你去看看泛型,只是在编译的时候检查参数类型是否正确,编译以后泛型都会被擦除的,也就是说List<String>和List是同一个class文件,不会有两个!

支持(0) 反对(0) 淡蓝涩 | 园豆:202 (菜鸟二级) | 2012-08-26 23:49

@淡蓝涩: 

这样的话,那我第一条语句的范型的作用相当于失效了?有什么办法保证不被擦除吗?
或者有其他更好的办法来达到我想要的效果吗?
谢谢你!
支持(0) 反对(0) iGeneral | 园豆:191 (初学一级) | 2012-10-18 21:40

@iGeneral: 自己封装一个返回和泛型类型相同数组的方法

支持(0) 反对(0) 淡蓝涩 | 园豆:202 (菜鸟二级) | 2012-10-19 00:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册