V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ukipoi
V2EX  ›  Java

请教下 Java 中, instanceof 在判断 Map 的时候怎么做?

  •  
  •   ukipoi · 2021-01-26 11:00:58 +08:00 · 3258 次点击
    这是一个创建于 1395 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如

    Object o = getXXX();
    if (o instanceof HashMap) {
        HashMap<String,?> map = (HashMap<String,?>) o;
        //HashMap map = (HashMap) o;
    }
    

    两种方式 IDE 都会警告,那怎么处理比较好呢?

    8 条回复    2021-12-11 09:39:02 +08:00
    zxlzy
        1
    zxlzy  
       2021-01-26 11:14:17 +08:00
    这个问题无解,只能
    @SuppressWarnings("unchecked")
    young1lin
        2
    young1lin  
       2021-01-26 11:17:12 +08:00
    楼上正解,你看它报什么警告,然后一般都会给你建议的。很多集合类的源码,都会加这个 @SuppressWarnings("unchecked")
    liudaolunhuibl
        3
    liudaolunhuibl  
       2021-01-26 11:32:08 +08:00
    instanceof Map 呢,直接用 HashMap 应该违反了里氏替换原则并且不一定是 HashMap 有可能是 concurrentHashMap 呢
    Menci
        4
    Menci  
       2021-01-26 19:36:58 +08:00
    没有很好的办法来判断,因为 Java 的编译是泛型擦除的,也就是说你写的所有泛型参数都只做编译器类型检查用,编译出来的程序,它的类型信息只是个 HashMap,并没有限制这个 HashMap 能存什么。所有的泛型变量编译出来都是 Object,你的 value 放进 Map 里就是以 Object 放进去的。

    如果真的要检查,就只能检查 HashMap 的每个成员的 key 是不是 String,当然这应该不是你想要的,你直接像上面说的那样忽略警告就好。
    palmers
        5
    palmers  
       2021-01-26 20:12:25 +08:00
    void xx() {
    Object o = get();
    if (o instanceof Map) {
    Map map = (Map) o;
    Object k = map.get("k");
    // k instanceof xx
    }
    }

    Object get() {
    return new HashMap<String, Object>();
    }

    这样逐步判断吧
    hdcjc
        6
    hdcjc  
       2021-01-27 10:07:42 +08:00
    如果能确定 key 或者 value 的类型,就写上相应的类型,再加上忽略警告的注解。不能确定的就用 ? ,两个都不能确定就两个都用 ? 。
    unbright
        7
    unbright  
       2021-01-28 13:54:34 +08:00
    class MyObject extends HashMap<String,Object>

    然后再 instanceof MyObject 就可以了。
    goalidea
        8
    goalidea  
       2021-12-11 09:39:02 +08:00
    Map 一时爽,维护火葬场
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2845 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:32 · PVG 08:32 · LAX 16:32 · JFK 19:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.