Java Android Studio 2比较对象和布尔编译成功,但不应';T

Java Android Studio 2比较对象和布尔编译成功,但不应';T,java,android,android-studio,gradle,equality,Java,Android,Android Studio,Gradle,Equality,我(错误地)在Android项目中编写了以下代码 for (Map<String, Object> occurrence : occurrences) { if (occurrence.get("cancelled") == true) { // don't display cancelled events continue; } ... for(贴图引用:引用){ if(occurrence.get(“cancelled”)

我(错误地)在Android项目中编写了以下代码

for (Map<String, Object> occurrence : occurrences) {
    if (occurrence.get("cancelled") == true) {
        // don't display cancelled events
        continue;
    }
    ...
for(贴图引用:引用){
if(occurrence.get(“cancelled”)==true){
//不显示已取消的事件
继续;
}
...
现在,据我所知,应该发生的是一个编译器错误,其影响是
错误:不可比较的类型:Object和boolean
,但事实并非如此。它成功编译,并以我预期/预期的方式运行。(确实,此处检索的值始终是装箱的
布尔值

我甚至从来没有注意到这一点,但在我提交代码后的一段时间,一个合作者拉到他的系统,试图编译,但得到了一个编译错误

在那之后,我再次检查以确保,但是我的代码肯定使用了
=
操作符,即使在清理和重建之后,它仍然可以很好地编译


这里发生了什么?是否有一些设置告诉Android Studio对此进行掩饰?不同版本的java工具链是否允许或不允许这种语法?我通过调用
.equals
,来替换比较,这是一个特殊的示例,但我们需要确保在将来编写/编译/测试c时ode它不会在其他人的机器上随机运行!

映射将保留键和值对。在您的代码中定义了映射,这意味着键是字符串类型,相应的键将您的值保存为对象而不是布尔值

如果要检查键是否存在于映射中,则必须使用map.containsKey(键)。如果键存在于hashmap中,则此方法将返回true。如果要比较当前元素是否存在,则必须使用get(),此方法将返回值类型

因此,您的代码的最终结论是:

for (Map<String, Object> occurrence : occurrences) {
    if (occurrence.get("cancelled")!=null) {
        // don't display cancelled events
        continue;
    }
for(贴图引用:引用){
if(发生率。获取(“取消”)!=null){
//不显示已取消的事件
继续;
}
方法2:

for (Map<String, Object> occurrence : occurrences) {
    if (occurrence.containsKey("cancelled")) {
        // don't display cancelled events
        continue;
    }
for(贴图引用:引用){
如果(事件发生日期(“取消”)){
//不显示已取消的事件
继续;
}

你们都在运行哪个操作系统、IDE、编译器版本等?这里有一个相关的问题和答案,可能有助于解释它。@geogemulligan很好的发现;我不知道为什么我的搜索没有看到这个问题。看起来其他问题确实有必要的线索来追踪这个问题,但这个问题的不同程度可能不会导致be完全相同(eclipse与android studio),而且被接受的答案相当模糊,链接显然已经腐烂。如果你想在Android Studio中写下更改该设置的详细信息,我会接受答案,否则我可能会在本周末亲自动手。感谢你给我这个机会。你可以在本周末或其他时候继续写下答案r你得去做。