代碼創建 HashMap<Integer, String>,通過反射獲取 put(Object, Object) 方法並調用 put(map, 1, new Object())。編譯運行均無錯,但調用 map.get(1) 時拋出 ClassCastException: java.lang.Object cannot be cast to java.lang.String。
Java 泛型採用類型擦除機制:編譯期進行類型檢查,生成的字節碼中不保留泛型參數信息。運行時 HashMap<Integer, String> 實際只是原始 HashMap,鍵值類型均為 Object。反射調用 Method.invoke 繞過了編譯器檢查,直接向 Map 放入 Object 實例,導致後續取值時強制轉型失敗。
Map.put(K, V) 擦除為 put(Object, Object),反射獲取的正是此方法。if (value instanceof String)。Class<T> 傳遞類型標記,或採用 Gson/Jackson 等庫處理序列化。參考《深入理解 Java 虛擬機》第 10 章「類型擦除與泛型實現原理」,及 Java 泛型實現原理:類型擦除。