gpt4 book ai didi

Java 泛型 : How to specify exact method signature

转载 作者:行者123 更新时间:2023-11-30 02:41:10 25 4
gpt4 key购买 nike

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

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 类型删除,SomeClass 构造函数的嵌套调用属于最通用的调用。

问题:有什么想法可以克服这种 Java 行为并强制它使用所需参数类型调用构造函数吗? (此处不接受静态 wrapper 和织物图案)

最佳答案

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

考虑代码:

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

然后使用 SomeClass(Object) 重载。

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

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

(顺便说一句,泛型构造函数确实很晦涩。)

关于Java 泛型 : How to specify exact method signature,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41661641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com