有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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?)


共 (2) 个答案

  1. # 1 楼答案

    要使用cast,需要使用非通配符类型参数(例如,Class<String>)声明theClass变量,如果它要引用不同基础类型的类,则不能这样做

    这很难看,但我不认为你可以在这里避免instanceof,这可能意味着有必要重新探讨为什么在同一张地图上有各种不同的类型

    但如果你要这么做,那么:

    if (value instanceof Integer) {
        myFun("myVal", (Integer)value);
    } else if (value instanceof String) {
        myFun("myVal", (String)value);
    } else if (value instanceof ...) {
        // ...
    } else {
        throw new AppropriateException();
    }
    

    不过,像这样的链条再次表明,你需要重新思考NodesFound

  2. # 2 楼答案

    这行不通

    编译器在编译时决定选择哪个重载方法

    你不能“推迟”到运行时

    实现这一目标的唯一方法是:

    • 对所有不同的情况使用instanceof和静态强制转换
    • 尝试设计一个使用覆盖的解决方案,就像在运行时那样(但这可能需要完全不同的设计)