• 举个栗子,ArrayList的toArray方法
  • list.toArray():将list直接转为Object[]数组,要想转回原类型必须一个元素一个元素强转
  • list.toArray(T[] a):将list转化为与入参数组类型一致的数组
  • 用第一个方法

    ArrayList<String> list=new ArrayList<>();
    for(int i=0;i<10;i++){
        list.add(""+i);
    }
    String[] array=(String[])list.toArray(); //报错:[Ljava.lang.Object; cannot be cast to [Ljava.lang.String
    
  • 不能把Object[]转为任意类型数组,只能一个一个转
  • 那为什么编译不报错呢?这是因为编译期间认为任何转型都是正确的
  • 运行时报错也不是一定的,如果这个数组中的所有父类元素原本就是由子类对象转换来的,那么要将这些父类对象转回子类就没问题

    Object[] arr=list.toArray();
    for(int i=0;i<arr.length;i++){
        String e=(String)arr[i];
    }
    
  • 第二个方法虽然不用强转但是需要自定义一个对应类型的数组传进去

    String[] arr=list.toArray(new String[list.size()]);
    for(String a:arr){
        System.out.println(a);
    }
    
  • 可不可以直接把链表传进去然后判断它的类型再转为对应数组呢?

    public static<T> T[] toArray(List<T> list){
        //由于泛型擦除,即使在运行的时候虚拟机也不知道T是什么,只把他当成Object一样处理,所以即使运行时也不报错
        T[] t=(T[])new Object[list.size()];
        for(int i=0;i<list.size();i++){
            t[i]=list.get(i);
        }
        //所以返回的其实还是Object数组
        return t;
    }
    
  • 调用它还是要先用Object数组接收再一个个转为String