亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將泛型 Class 參數限制為實現 Map 的類

將泛型 Class 參數限制為實現 Map 的類

皈依舞 2022-06-23 20:09:43
我正在嘗試編寫一個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> 可能沒有默認構造函數,這會引發錯誤(響應速度不是很快)


查看完整回答
反對 回復 2022-06-23
?
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()


查看完整回答
反對 回復 2022-06-23
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

以下將起作用:


public MapBuilder(Class<? extends Map> mapType) throws Exception {

    map = mapType.newInstance();

}


查看完整回答
反對 回復 2022-06-23
  • 3 回答
  • 0 關注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號