今天在练习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() 在功能上是相同的。
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()是不一样的。
谢谢你,知道了要这么做,但还是不明白为什么,不过没事,以后我会慢慢明白的!
LinkedList。toArray()返回的是将LinkedList内部维护的数组拷贝一份返回,客户端可以任意修改。这样确保了内部的数据的安全性。
泛型在编译以后被擦除,返回的是Obeject[]的类型,当然要强制转换了!
@igeneral:
你去看看泛型,只是在编译的时候检查参数类型是否正确,编译以后泛型都会被擦除的,也就是说List<String>和List是同一个class文件,不会有两个!
@淡蓝涩:
@iGeneral: 自己封装一个返回和泛型类型相同数组的方法