[英]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.