Следующий кодРазрешено сравнение равенства `boolean` и` Object`?
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
}
}
компилируется без ошибок с javac
V1.7.0_15 и печатает «ложь» при запуске. Тем не менее, Eclipse Juno жалуется на «Несовместимые типы операндов Object и boolean».
Видимо JAVAC autoboxes примитивного булево b
, а затем сравнивает o
и autoboxed b
объектного равенство, получая false
, в то время как Eclipse, отказывается делать Autoboxing.
Какое правильное поведение соответствует спецификации языка Java? Где я должен регистрировать ошибку?
Примечание: Если изменить тип o
к Boolean
, все работает, как ожидалось: Затмение принимает код, и код выведет «истинный».
Runnable version on ideone.com
Проверьте настройки Eclipse, и посмотреть, если есть что-то в стиле фанк: Свойства проекта -> Java Compiler -> Ошибки/предупреждения -> Потенциальный Программирование Проблемы – blondeamon
Зависит то, что вы «ожидаемый» - она должна поле 'b' и использовать равенство ссылок (печать false) или unbox 'o' и использование примитивного логического равенства (печать true)? –
[java AutoBoxing rules] (http://jcp.org/aboutJava/communityprocess/jsr/tiger/autoboxing.html) –