簡體   English   中英

Java泛型:如何指定確切的方法簽名

[英]Java generics: How to specify exact method signature

我有一個帶有各種構造函數的類:

public class SomeClass {

    public SomeClass(Object obj) {
        Log.d("x", "SomeClass(Object)");
    }

    public SomeClass(Integer num) {
        Log.d("x", "SomeClass(Integer)");
    }

    public SomeClass(String str) {
        Log.d("x", "SomeClass(String)");
    }

    public <K, V> SomeClass(Map<K, V> map) {
        Log.d("x", "SomeClass(List)");
        for (K key : map.keySet()) {
            new SomeClass(key);
            new SomeClass(map.get(key));
        }
    }
}

...以及一些通過以下方式使用它的代碼:

HashMap<String, Integer> map = new HashMap<>();
map.put("key", 100);
new SomeClass(map);

結果是這樣的輸出:

"SomeClass(List)"
"SomeClass(Object)"
"SomeClass(Object)"

而不是必需的

"SomeClass(List)"
"SomeClass(String)"
"SomeClass(Integer)"

我想由於Java Type Erasure,SomeClass構造函數的嵌套調用屬於最普通的構造函數。

問題:關於如何克服這種Java行為並強制其以必需的參數類型調用構造函數的想法? (此處不接受靜態包裝器和Fabric模式)

重載在編譯時完成,因此使用變量的靜態類型而不是運行時類型。 這與泛型無關。

考慮代碼:

Object value = "value";
SomeClass something = new SomeClass(value);

然后使用SomeClass(Object)重載。

您可以使用instanceof ,但這通常可以很好地表明設計中存在問題。 幾乎可以肯定,您希望Map具有相關的類型。 目前,您可以將最后一個構造函數編寫為:

public SomeClass(Map<?, ?> map) {

(順便說一句,通用構造函數確實很晦澀。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM