Java泛型:如何指定精确的方法签名

时间:2017-01-15 13:32:16

标签: java generics

我有一个包含各种构造函数的类:

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行为并强制它调用带有所需参数类型的构造函数? (此处不接受静态包装和布料图案)

1 个答案:

答案 0 :(得分:2)

重载在编译时完成,因此使用变量的静态类型而不是运行时类型。这与泛型无关。

考虑代码:

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

然后使用SomeClass(Object)重载。

您可以使用instanceof,但这通常表明设计中存在问题。几乎可以肯定,您希望Map具有相关类型。目前你可以把最后一个构造函数写成:

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

(顺便说一句,通用构造函数真的很模糊。)