我(错误地)在Android项目中编写了以下代码。
for (Map<String, Object> occurrence : occurrences) {
if (occurrence.get("cancelled") == true) {
// don't display cancelled events
continue;
}
...
现在,根据我的理解,应该发生的事情是error: incomparable types: Object and boolean
的效果存在编译器错误,但事实并非如此。它成功编译,并按照我预期/预期的方式行事。 (确实,此处检索的值将始终为方框boolean
。)
我从来没有注意到这一点,但是在我提交代码之后的一段时间,一个合作者拉到他的系统,尝试编译,并得到编译错误。
在发生这种情况之后,我仔细检查以确保,但我的代码肯定是使用==
运算符,即使在清理和重建后它仍然可以正常编译。
这里发生了什么?是否有一些设置告诉Android Studio掩饰这个?不同版本的java工具链是允许还是不允许这种语法?我已经得到了这个特殊的例子,只需用.equals
调用来替换比较,但是我们需要确保将来当我们编写/编译/测试代码时它根本不会随机工作在另一个人的机器上!
答案 0 :(得分:0)
地图将保存键和值对。在您的代码中,您定义了Map,这意味着,key是一个String类型,对应的键将您的保存值作为对象而不是布尔值。
如果要检查地图中是否存在关键字,则必须使用map.containsKey(key)。如果hashmap中存在key,则此方法将返回true。如果要比较当前元素是否存在则必须使用get(),此方法将返回Value类型。
所以你的代码是最后的结论:
for (Map<String, Object> occurrence : occurrences) {
if (occurrence.get("cancelled")!=null) {
// don't display cancelled events
continue;
}
方法2:
for (Map<String, Object> occurrence : occurrences) {
if (occurrence.containsKey("cancelled")) {
// don't display cancelled events
continue;
}