java如何动态确定对象类型的文本的实际类型
我有一个带有一些值的HashMap
。我想迭代映射中的每个值,并为每个值调用一个方法myFun()
myFun()
是一个重载方法,它有两个参数:一个是String,另一个可以是Integer、Decimal、Float、String、String[]、Value、Value[]等类型:
Map<String, Object> NodesFound = new HashMap<>();
String[] children = {"child1","child2","child3","child4"};
NodesFound.put("String", "Hi its a string");
NodesFound.put("Number", 1);
NodesFound.put("children", children);
Set<String> nodeLabels = NodesFound.keySet();
for (String label : nodeLabels) {
Object value = NodesFound.get(label);
Class<?> theClass = value.getClass();
myFun("myVal", theClass.cast(value))
}
应为:myFun()
不应给出类型不匹配错误
实际: 将出现以下编译错误: 类型节点中的方法myFun(String,Value)不适用于参数(String, 捕获#3-of?)
# 1 楼答案
要使用
cast
,需要使用非通配符类型参数(例如,Class<String>
)声明theClass
变量,如果它要引用不同基础类型的类,则不能这样做这很难看,但我不认为你可以在这里避免
instanceof
,这可能意味着有必要重新探讨为什么在同一张地图上有各种不同的类型但如果你要这么做,那么:
不过,像这样的链条再次表明,你需要重新思考
NodesFound
# 2 楼答案
这行不通
编译器在编译时决定选择哪个重载方法
你不能“推迟”到运行时
实现这一目标的唯一方法是: