簡體   English   中英

有沒有辦法在不創建新的臨時ArrayList的情況下更改ArrayList的泛型類型?

[英]Is there a way to change the generic type of an ArrayList without creating a new temporary ArrayList?

我們可以在創建ArrayList<?>()后更改其通用參數類型,例如將其從Arraylist<Integer>()更改為ArrayList<String> ,而無需使用臨時ArrayList來保存元素然后復制它們的情況。回到新清單?

如果這兩種類型之間存在有效的轉換,則可以這樣做。 例如:

List<Integer> ints = Arrays.asList(1,2,3,4,5,6);
List<Long> longs = ints.stream().map(val -> (Long) (long) (int) val).collect(Collectors.toList());
System.out.println(longs);

輸出:

[1、2、3、4、5、6]

這將獲取一個Integer的列表,應用轉換函數使每個參數都成為Long ,然后將轉換后的值收集到Long的列表中。

起作用的原因在於轉換函數: val -> (Long) (long) (int) val 此函數采用一個Integer ,將其取消裝箱為int ,將其擴展為long ,然后將其裝箱為Long 因此,該函數定義了從IntegerLong的轉換。 這也適用於您知道類型的其他實例。 例如,如果您有以下情況:

class A {}
class B extends A{}
List<A> as = Arrays.asList(new B(), new B());
List<B> bs = as.stream().map(val -> (B) val).collect(Collectors.toList());
System.out.println(bs);

它還將進行編譯,並輸出如下內容:

[B @ 681a9515,B @ 3af49f1c]

之所以可行,是因為在轉換函數( val -> (B) val )中,您將A列表中的所有值都轉換為類型B 但是,如果您強制轉換的值不是B真正實例,則將拋出ClassCastException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM