Integer Long
^ ^
| | auto-boxing/auto-unboxing
| |
v v
int -----------------------> long
primitive promotion
Эта схема показывает, что неявные преобразования Java может сделать между различными вещами.
В Java, объектами и примитивах, к сожалению, являются разные животные: Long
и long
- это не то же самое. Неявное преобразование от long
до Long
называется авто-бокс. Неявное преобразование от Long
к long
называется авто-unboxing. Этот вид конверсии описан в section 5.1.8 of the Java Language Specification.
Также, как и многие другие языки, Java имеет неявные преобразования между числовыми типами. Значение int
неявно продвигается до long
, если оно используется в выражении, которое содержит другие long
. Контексты, в которых эти рекламные акции могут произойти, описаны в section 5.6 of the Java Language Specification.
Обратите внимание, что буква 1
в Java имеет тип int
. Литерал 1L
имеет тип long
.
Long v = ...
if(v == -1) ...
v
является Long
и -1
является int
. Java не знает, как сравнивать объекты и примитивы: он полагается на свои правила конверсии implicits для этого. Здесь -1
преобразуется (с автоматической коробкой) в Integer
. Итак, мы сравниваем ссылку на два объекта, которые даже не имеют один и тот же тип: тест терпит неудачу.
Long v = ...
if(v.equals(-1)) ...
Это то же самое, что и выше, за исключением того, что это не Comparision, что вызывает неявное преобразование, но вызов метода. equals
принимает параметр Object
, поэтому -1
преобразуется (с автоматической коробкой) в Integer
. Неявные преобразования, вызванные вызовами методов, описаны в section 5.3 of the Java Language Specification.
Long v = ...
if(v.equals(new Long(-1))) ...
Здесь мы называем Long.equal
метод с Long
в качестве параметра, так что тест успешно.
Какое сравнение работает?
Long v = ...
if(v.equals(-1L)) ...
-1L
является long
. Он передается методу, который ожидает Object
, поэтому он неявно преобразован (автоматически помечен) в Long
. Тест успешно завершен.
Long v = ...
if(v.longValue() == -1) ...
v.longValue()
является long
, -1
является int
. -1
- long
, что связано с оператором ==
. Тест успешно завершен.
использовать -1L вместо -1? – zenbeni
Подсказка: 'Long' - это объект. – Maroun
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – PeterMmm