2016-04-28 18 views
1

我(錯誤地)在Android項目中編寫了下面的代碼。Android Studio 2比較對象和布爾編譯成功時,它不應該?

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

哪個操作系統,IDE,編譯器版本等進行了你們倆運行? – shmosel

+1

以下是可能有助於解釋的相關問題和答案。 http://stackoverflow.com/questions/16770403/equality-comparison-of-boolean-and-object-allowed。 –

+0

@GeorgeMulligan好找;我不知道爲什麼我的搜索沒有看到那個。它看起來像其他問題確實有必要的線索來跟蹤這個問題,但問題是不同的,可能不是一個完全重複的(日食與android工作室),而且接受的答案是相當模糊的鏈接顯然腐爛。如果您想在Android Studio中寫下更改該設置的詳細信息,我會接受答案,否則我可能會在本週末自行解決。 – GrandOpener

回答

0

地圖將保存鍵和值對。在你的代碼中你定義了Map,這意味着,鍵是一個字符串類型,並將你的保存值作爲一個對象而不是布爾值。

如果你想檢查鍵是否存在於地圖中,那麼你必須使用map.containsKey(key)。如果密鑰存在於散列映射中,此方法將返回true。如果你想比較當前存在的元素,那麼你必須使用get(),這個方法將返回值類型。

所以最後的結論你的代碼是:

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