1. 程式人生 > 其它 >List集合轉換成陣列

List集合轉換成陣列

我現在有個需求:將File集合轉換成MultipartFile陣列結構

然後我就開始在網上開啟了List轉換到陣列之旅。

首先來看一個例子

        ArrayList<String> list=new ArrayList<String>();
        list.add("1");
        String[] strings=(String [])list.toArray();
        System.out.println(strings);

然後爆出異常資訊:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

不能夠由 Object 轉換成 String型別

這樣寫編譯沒有什麼問題,但是執行時會報ClassCastException,這是因為Java中允許向上和向下轉型,但是這個轉型是否成功是根據Java虛擬機器中這個物件的型別來實現的。Java虛擬機器中儲存了每個物件的型別。而陣列也是一個物件。陣列的型別是java.lang.Object。把java.lang.Object轉換成java.lang.String是顯然不可能的事情,因為這裡是一個向下轉型,而虛擬機器只儲存了這是一個Object的陣列,不能保證陣列中的元素是String的,所以這個轉型不能成功。數組裡面的元素只是元素的引用,不是儲存的具體元素,所以陣列中元素的型別還是儲存在Java虛擬機器中的。

        ArrayList<String> list = new ArrayList<String>();
        list.add("1");
        String[] array2 = list.toArray(new String[list.size()]);
        System.out.println(array2);
        for (int i = 0; i < array2.length; i++) {
            System.out.println(array2[i]);
        }

列印輸出:

[Ljava.lang.String;@1b6d3586
1

然後來到了我的需求中來,但是由File的List集合到MultipartFile陣列

List<MultipartFile> multipartFileList = new ArrayList<>();

MultipartFile[] multipartFiles = new MultipartFile[size];

我是利用這種方式來解決的。

但是我最開始想到的是MultipartFile是介面,肯定不能夠通過new的方式來進行建立。

但是這麼來做確實是可行的,因為建立陣列記憶體空間中多了一塊區域來進行儲存陣列中的資料型別。

而對應的空間中只需要保證儲存的是對應的型別或者是子型別即可。