假設我有一個List<Base>
,我知道它只包含Derived
類型的元素,我該如何強制轉換爲List<Derived>
?將泛型列表投射到子類型(不安全的逆變)
0
A
回答
1
我的解決辦法:
public static <T> List<T>
cast(List<? super T> list, Class<T> clazz) {
if(list.stream().allMatch(clazz::isInstance))
return (List<T>) list;
else
throw new IllegalArgumentException ("Not all inputs are of class " + clazz.getName());
}
+1
你可以使用'List super T>'來防止有人試圖調用'List
+0
@BoristheSpider好點! –
0
public static void main(String[] args) {
List<Number> foo = new ArrayList<>();
List<Integer> a = cast(foo);
System.out.println("a = " + a);
}
public static <T, C extends T> List<C> cast(List<T> l) {
return (List<C>) l;
}
相關問題
- 1. 將泛型投射到它的子類
- 2. 將子列表投射到父類型列表
- 3. 如何手動投射泛型類型?
- 4. 無法警告投射泛型類型?
- 5. 無法投泛型列表到自定義列表類型
- 6. 將表格行轉換爲列(並投射到不同類型)
- 7. 如何在C#中使用泛型進行安全的投射?
- 8. 將子類投射到基類後,類型仍然是子類
- 9. 在泛型中的類型安全
- 10. Java類投射例外泛型
- 11. 如何使用泛型類型的泛型列表泛型類
- 12. 如何將不同類型的泛型列表合併到一個泛型自定義類型列表中?
- 13. 逆變在泛型C#
- 14. 類型安全:從對象到列表未選中投射<MyObject>
- 15. 在緩存不同類型時使用泛型避免投射
- 16. 對非泛型類型的協變/逆變支持?
- 17. 如何在不知道類型的情況下投射泛型類型
- 18. 確保與Java泛型類型安全
- 19. 泛型子列表
- 20. 將具體對象列表投射到抽象類型
- 21. 將對象投射到未知類型
- 22. 將模板類型名投射到uint64
- 23. 將對象投射到通用類型
- 24. 將實體類型映射到投影
- 25. Java的泛型類投
- 26. 泛型類型的子類
- 27. 如何將泛型類型作爲交換輸入體而不是投射?
- 28. 無法將類型的Exam_Mapper投射到IMapper類型
- 29. protobuf網不序列化泛型類型的泛型類型
- 30. 反射和泛型類型
讓它生和投退。聞起來雖然。 –
作爲單行列表派生=(列表)(列表)基地;',但的確,這聽起來像一個可疑的設計。 –
Marco13