我正在嘗試編寫一個Map構建器。其中一個構造函數將允許客戶端指定Map他們希望構建的類型public class MapBuilder<K, V> { private Map<K, V> map; /** * Create a Map builder * @param mapType the type of Map to build. This type must support a default constructor * @throws Exception */ public MapBuilder(Class<? extends Map<K, V>> mapType) throws Exception { map = mapType.newInstance(); } // remaining implementation omitted}目的是應該可以通過以下方式構造構建器的實例:MapBuilder<Integer, String> builder = new MapBuilder<Integer, String>(LinkedHashMap.class);或者MapBuilder<Integer, String> builder = new MapBuilder<Integer, String>(HashMap.class);似乎構造函數參數的類型簽名當前不支持這一點,因為上面的行會導致“無法解析構造函數”編譯錯誤。如何更改我的構造函數以使其接受Map僅實現的類?
3 回答

拉風的咖菲貓
TA貢獻1995條經驗 獲得超2個贊
使用 aSupplier而不是 a Class:
public MapBuilder(Supplier<? extends Map<K, V>> supplier) {
map = supplier.get();
}
然后可以這樣調用:
MapBuilder<Integer, Integer> builder = new MapBuilder<>(LinkedHashMap::new);
這也更安全,因為 aClass<Map> 可能沒有默認構造函數,這會引發錯誤(響應速度不是很快)

FFIVE
TA貢獻1797條經驗 獲得超6個贊
問題LinkedHashMap.class
是
Class<LinkedHashMap>
而不是像
Class<LinkedHashMap<Integer, String>>
這些也是不可轉換的類型(所以你不能轉換它)并且沒有辦法獲得后者的實例。
您可以做的是將構造函數更改為
public MapBuilder(Class<? extends Map> mapType) throws Exception
泛型在運行時被刪除,所以在運行時所有Map
的 s 都會表現得像Map<Object, Object>
無論如何。因此,您構建的類是否使用原始類型并不重要。
順便說一句,Class::newInstance
已棄用。利用
mapType.getConstructor().newInstance()

慕哥6287543
TA貢獻1831條經驗 獲得超10個贊
以下將起作用:
public MapBuilder(Class<? extends Map> mapType) throws Exception {
map = mapType.newInstance();
}
添加回答
舉報
0/150
提交
取消