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

今天在练习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()前还要进行强制类型换换呢?这样范型的作用不久丢失了吗?


  • 谢谢!


www说
浏览 1952回答 2
2回答

慕斯709654

LinkedList<String>&nbsp;llStrings&nbsp;=&nbsp;new&nbsp;LinkedList<String>();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i<100;i++){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;llStrings.add(""+i); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;arry&nbsp;=&nbsp;new&nbsp;String[llStrings.size()]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arry&nbsp;=&nbsp;llStrings.toArray(arry); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(arry.length);这样就可以了,它需要指定要转换的类型toArray(T[]&nbsp;a)&nbsp;和toArray()是不一样的。

杨__羊羊

LinkedList。toArray()返回的是将LinkedList内部维护的数组拷贝一份返回,客户端可以任意修改。这样确保了内部的数据的安全性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java