[英]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
。 因此,該函數定義了從Integer
到Long
的轉換。 這也適用於您知道類型的其他實例。 例如,如果您有以下情況:
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.