
比如
Object o = getXXX(); if (o instanceof HashMap) { HashMap<String,?> map = (HashMap<String,?>) o; //HashMap map = (HashMap) o; }两种方式 IDE 都会警告,那怎么处理比较好呢?
1 zxlzy 2021 年 1 月 26 日 这个问题无解,只能 @SuppressWarnings("unchecked") |
2 young1lin 2021 年 1 月 26 日 楼上正解,你看它报什么警告,然后一般都会给你建议的。很多集合类的源码,都会加这个 @SuppressWarnings("unchecked") |
3 liudaolunhuibl 2021 年 1 月 26 日 instanceof Map 呢,直接用 HashMap 应该违反了里氏替换原则并且不一定是 HashMap 有可能是 concurrentHashMap 呢 |
4 Menci 2021 年 1 月 26 日 没有很好的办法来判断,因为 Java 的编译是泛型擦除的,也就是说你写的所有泛型参数都只做编译器类型检查用,编译出来的程序,它的类型信息只是个 HashMap,并没有限制这个 HashMap 能存什么。所有的泛型变量编译出来都是 Object,你的 value 放进 Map 里就是以 Object 放进去的。 如果真的要检查,就只能检查 HashMap 的每个成员的 key 是不是 String,当然这应该不是你想要的,你直接像上面说的那样忽略警告就好。 |
5 palmers 2021 年 1 月 26 日 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>(); } 这样逐步判断吧 |
6 hdcjc 2021 年 1 月 27 日 如果能确定 key 或者 value 的类型,就写上相应的类型,再加上忽略警告的注解。不能确定的就用 ? ,两个都不能确定就两个都用 ? 。 |
7 unbright 2021 年 1 月 28 日 class MyObject extends HashMap<String,Object> 然后再 instanceof MyObject 就可以了。 |
8 goalidea 2021 年 12 月 11 日 Map 一时爽,维护火葬场 |