2016-04-28 14 views
1

Ich (fälschlicherweise) schrieb den folgenden Code in einem Android-Projekt.Android Studio 2 vergleicht Objekt und boolesche Kompilierung erfolgreich, wenn es nicht sollte?

for (Map<String, Object> occurrence : occurrences) { 
    if (occurrence.get("cancelled") == true) { 
     // don't display cancelled events 
     continue; 
    } 
    ... 

Nun, wie ich es verstehe, was passiert sein sollte gibt es einen Compiler-Fehler auf die Wirkung von error: incomparable types: Object and boolean, aber das ist nicht das, was passiert ist. Es kompilierte erfolgreich und verhielt sich so, wie ich es erwartet hatte. (Es ist wahr, dass der Wert, der hier abgerufen wird, immer eine Box sein wird

Ich hätte das nie bemerkt, aber einige Zeit nachdem ich den Code eingereicht hatte, versuchte ein Kollaborateur an seinem System zu versuchen kompilieren und einen Kompilierungsfehler bekommen.

Danach habe ich überprüft, um sicherzustellen, aber mein Code ist definitiv mit dem ==-Operator, und es kompiliert immer noch fein, auch nach der Reinigung und Wiederaufbau.

Was geht hier vor? Gibt es eine Einstellung, die Android Studio anweist, dies zu beschönigen? Erlauben oder verbieten verschiedene Versionen der Java Toolchain diese Syntax? Ich habe dieses spezielle Beispiel, indem ich nur den Vergleich durch einen Anruf an .equals ersetze, aber wir müssen in der Zukunft sicher sein, dass, wenn wir schreiben/kompilieren/Code prüfen, es nicht zufällig überhaupt nicht auf dem anderen Typ funktionieren wird Maschine!

+0

Welche OS, IDE, Compiler-Version usw. wurden Sie beide laufen? – shmosel

+1

Hier ist eine verwandte Frage und Antwort, die dazu beitragen könnte, es zu erklären. http://stackoverflow.com/questions/16770403/equality-comparison-of-boolean-and-object-allowed. –

+0

@GeorgeMulligan Gut finden; Ich weiß nicht, warum meine Suche das nicht gesehen hat. Es sieht so aus, als hätte diese andere Frage die nötigen Hinweise, um das zu verfolgen, aber die Frage ist anders genug, um wahrscheinlich kein exaktes Duplikat zu sein (Eclipse vs. Android Studio), und auch die angenommene Antwort ist ziemlich vage mit der Verbindung anscheinend verrottet. Wenn Sie die Details zum Ändern dieser Einstellung in Android Studio aufschreiben möchten, akzeptiere ich die Antwort, sonst werde ich wahrscheinlich dieses Wochenende selbst dazukommen. – GrandOpener

Antwort

0

Karte enthält Schlüssel und Wertpaar. In Ihrem Code haben Sie Map definiert, dh Schlüssel ist ein String-Typ und der entsprechende Schlüssel ist Ihr Speicherwert als Objekt nicht boolesch.

Wenn Sie überprüfen möchten, dass der Schlüssel in der Karte vorhanden ist, müssen Sie map.containsKey (key) verwenden. Diese Methode gibt true zurück, wenn der Schlüssel in der hashmap vorhanden ist. Wenn Sie das aktuelle Element vergleichen möchten, müssen Sie get() verwenden. Diese Methode gibt den Werttyp zurück.

So endgültige Schlussfolgerung Ihr Code:

for (Map<String, Object> occurrence : occurrences) { 
    if (occurrence.get("cancelled")!=null) { 
     // don't display cancelled events 
     continue; 
    } 

Methode 2:

for (Map<String, Object> occurrence : occurrences) { 
    if (occurrence.containsKey("cancelled")) { 
     // don't display cancelled events 
     continue; 
    }