Map<String, List<String>> resultMap = new HashMap<>();
List<Integer> intList = Arrays.asList(1,2,3);
resultMap.put("numbers", intList); // 編譯錯誤:List<Integer> 不能轉為 List<String>
Java 泛型不變性:List<Integer> 不是 List<String> 的子類型,即使 Integer 繼承 Object。
Map<String, List<?>> resultMap = new HashMap<>(); // 通配符,接受任意 List
resultMap.put("numbers", intList);
resultMap.put("names", Arrays.asList("a","b"));
取出時需類型檢查或轉換:
List<?> list = resultMap.get("numbers");
if (!list.isEmpty() && list.get(0) instanceof Integer) {
List<Integer> ints = (List<Integer>) list; // 安全轉換
}
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("numbers", intList);
resultMap.put("single", 123);
resultMap.put("text", "hello");
取出時需 instanceof 判斷再強轉。
public class DataWrapper<T> {
private List<T> data;
private Class<T> type;
// getter/setter
}
Map<String, DataWrapper<?>> map = new HashMap<>();
map.put("numbers", new DataWrapper<>(intList, Integer.class));
| 場景 | 推薦方案 |
|---|---|
| 內部臨時聚合,類型可控 | 方案一 Map<String, List<?>> |
| 異構數據聚合(列表+單值+Map) | 方案二 Map<String, Object> |
| 對外 API、需嚴格類型校驗 | 方案三 封裝 DTO |