Poniższy kodRówne porównanie wartości `boolean` i` Object` dozwolone?
public class TestComparison {
public static void main(String[] args) throws Exception {
boolean b = true;
Object o = new Boolean(true);
System.out.println("comparison result: "+
(o == b)); // Eclipse complains about this expression
}
}
kompiluje bez błędów z javac
V1.7.0_15 i drukuje "false" gdy bieg. Jednak Eclipse Juno narzeka na "Niezgodne typy operandów Object i boolean".
Widocznie javac autoboxes pierwotną logiczną b
, a następnie porównuje o
i autoboxed b
o równości obiektu, otrzymując false
, natomiast Eclipse odmawia zrobić autoboxing.
Jakie zachowanie jest właściwe zgodnie ze specyfikacją języka Java? Gdzie powinienem zgłosić błąd?
Uwaga: Jeśli zmienić typ o
do Boolean
, wszystko działa zgodnie z oczekiwaniami: Eclipse przyjmuje kod i drukuje kod „true”.
Runnable version on ideone.com
Sprawdź ustawienia Eclipse i zobaczyć, czy jest tam coś Funky: Właściwości projektu -> Java Compiler -> Błędy/ostrzeżenia -> Potencjalne Programowanie Problemy – blondeamon
Zależy czego „oczekiwany” - należy przez to pole 'B' i używać równości odniesienia (drukowanie fałszywe) lub unbox 'o' i użycie prymitywnej równości boolowskiej (drukowanie prawda)? –
[zasady java AutoBoxing] (http://jcp.org/aboutJava/communityprocess/jsr/tiger/autoboxing.html) –