为了账号安全,请及时绑定邮箱和手机立即绑定

java 泛型的问题

java 泛型的问题

jeck猫 2019-03-22 18:15:29
我想写一个方法list->array 想利用泛型,代码如下public static <T> T[] list2Array(List<T> list){    T[] array = (T[])list.toArray(new T[list.size()]);    return array;}也就是传过来的String就返回String数组 Integer就返回Integer数组。但是这个new T[list.size]这里有问题,请问怎么解决?谢谢。
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

这个Effective Java第二版里有说到, Item25.


Because of these fundamental differences, arrays and generics do not

mix well. For example, it is illegal to create an array of a generic

type, a parameterized type, or a type parameter. None of these array

creation expressions are legal: new List[], new List[], new

E[]. All will result in generic array creation errors at compile time.


Generally speaking, arrays and generics don’t mix well. If you find

yourself mixing them and getting compile-time errors or warnings, your

first impulse should be to replace the arrays with lists.


因为数组和泛型不对付, 所以在不做强制类型转换的情况下, 我们是没有办法得到一个泛型数组的实例的, 编译器会限制此类情况发生(new E[], list.toArray());

为什么数组和泛型不对付, Effective Java里有例子. 根本原因在于:

Arrays are covariant. This scary-sounding word means simply that if

Sub is a subtype of Super, then the array type Sub[] is a subtype of

Super[].


给出例子说明我的理解, 类似的代码, 在泛型集合下, 会在静态编译阶段报错; 而泛型数组在运行阶段给出ArrayStoreException:

private <T> void doSomethingToGenArr(T[] tArr){

    Object[] oArr = tArr;

    oArr[0] = new String("aaa");

}


private <T> void doSomethingToGenList(List<T> list){

    List<Object> l1 =  list; /* compile error */

    l1.set(0, new String("aaa"));

}


@Test

public void test111(){

    doSomethingToGenArr(new Integer[2]);

}


@Test

public void test112(){

    doSomethingToGenList(new ArrayList<Integer>());

}


查看完整回答
反对 回复 2019-04-15
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

查看完整回答
反对 回复 2019-04-15
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

toArray()方法有两种,带参和不带参.
带参的情况下,参数就是一个一个泛型数组,如T[] a,相当于你手动构造一个数组,传入方法中.
toArray()内部是一个copy的实现.

举两个例子.
1:String[][] str_a = (String [][]) arr.toArray(new String[0][0]);

2 :String[][] a = new String[<size>][size];
String [][] str_a = (String [][]) arr.toArray(a);

当然 要保证转型成功,不然会引发ClassCastException.

--------------------------分割线-------------------------

以下是源码中是实现,实际上就是一个copy操作.

 /**

     * Returns an array containing all of the elements in this list

     * in proper sequence (from first to last element).

     *

     * <p>The returned array will be "safe" in that no references to it are

     * maintained by this list.  (In other words, this method must allocate

     * a new array).  The caller is thus free to modify the returned array.

     *

     * <p>This method acts as bridge between array-based and collection-based

     * APIs.

     *

     * @return an array containing all of the elements in this list in

     *         proper sequence

     */

    public Object[] toArray() {

        return Arrays.copyOf(elementData, size);

    }


查看完整回答
反对 回复 2019-04-15
  • 3 回答
  • 0 关注
  • 506 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号