比较对象和布尔编译的Android Studio 2何时不应该成功?

时间:2016-04-28 03:34:57

标签: java android android-studio gradle equality

我(错误地)在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调用来替换比较,但是我们需要确保将来当我们编写/编译/测试代码时它根本不会随机工作在另一个人的机器上!

1 个答案:

答案 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;
    }