2015-01-10 2 views
2
System.out.println(" answer is " + (5.0==5L)); 

Это возвращает true! Он должен вернуть значение false, потому что сравниваются два разных типа. Несмотря на то, что double сравнивается с значением long!Почему 5.0 == 5L вернет мне истину?

+1

вкусах, но я на самом деле предпочитайте выражение, оценивающее значение true. Случается, что 'long' преобразуется в' double', а затем сравнение выполняется очевидным образом. – 5gon12eder

+0

Поскольку они оба являются цифрами, и поскольку вы на самом деле ссылаетесь на сравнение в своем коде, Java предполагает, что вы хотите сравнить их как числа, преобразует длинные и пытается выполнить сравнение. Какой смысл иметь оператор, который компилирует ('double == long'), но возвращает постоянное значение (' false')? –

+0

с использованием == operator with unboxing effect, вероятно, преобразует rvalue в тип lvalue. в вашем случае длинный конвертируется в двойное. Это также сообразительность компилятора. Подумайте о том, что вы хотели, если бы имело 5.6 == 5L – ha9u63ar

ответ

9

Два операнда проходят через двоичное числовое продвижение согласно JLS section 5.6.2, чтобы перейти к одному типу для обоих операндов.

Правила как это:

  • Если какой-либо из операндов имеет ссылочного типа, его подвергают конверсии распаковки (§5.1.8).
  • примитивные преобразования Добавление новых (§5.1.2) применяется для преобразования одного или обоих операндов, как указано по следующим правилам:
    • Если один из операндов имеет тип double, другой преобразуется в double.
    • ...
  • ...

Ваш второй операнд имеет тип double, поэтому значение long неявно преобразуется в double, то два double значения сравниваются - и они равны.

4

При сравнении long с до double с, long повышается до double, а затем два сравниваются. Поскольку оба равны пяти, результат равен true.

2

Он возвращает true, потому что он сравнивает два типа «примитивных переменных». И если они имеют одинаковое значение, это работает.

Для сравнения, используя «==» на «объект переменных» возвращает истину, если ссылка на тот же объект, например

Object a = new Object(); 
Object b = a; 
//then a==b is true 

Но:

Object a = new Object(); 
Object b = new Object(); 
//then a==b is false