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

2021-01-26 11:00:58 +08:00
 ukipoi

比如

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

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

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

如果真的要检查,就只能检查 HashMap 的每个成员的 key 是不是 String,当然这应该不是你想要的,你直接像上面说的那样忽略警告就好。
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
2021-01-27 10:07:42 +08:00
如果能确定 key 或者 value 的类型,就写上相应的类型,再加上忽略警告的注解。不能确定的就用 ? ,两个都不能确定就两个都用 ? 。
unbright
2021-01-28 13:54:34 +08:00
class MyObject extends HashMap<String,Object>

然后再 instanceof MyObject 就可以了。
goalidea
2021-12-11 09:39:02 +08:00
Map 一时爽,维护火葬场

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/748420

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX