首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Map 存放不同泛型 List 的正確姿勢

     編輯:程式設計綜合問答

問題現象

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。

解決方案

方案一:聲明值類型為 List<?> 或 List<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; // 安全轉換
}

方案二:值類型為 Object(最靈活,類型安全最低)

Map<String, Object> resultMap = new HashMap<>();
resultMap.put("numbers", intList);
resultMap.put("single", 123);
resultMap.put("text", "hello");

取出時需 instanceof 判斷再強轉。

方案三:統一封裝為通用 DTO(類型安全最高)

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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved