2013-11-12 2 views
1

Я пишу простое условиеСравнивая Long простого целого числа в Java

List<Long> path = doSomething(); // returns a list of Long and all equal to -1 
if (path.get(0)==-1) 
    sysout("first condition works"); // never executes 
if (path.get(0).equals(-1)) 
    sysout("sec condition works"); //never executes 
if (path.get(0).equals(new Long(-1))) 
    sysout("third condition works"); //works! 

Почему это? Пожалуйста, укажите мне статью в официальных файлах документов, чтобы узнать больше!

+1

использовать -1L вместо -1? – zenbeni

+0

Подсказка: 'Long' - это объект. – Maroun

+0

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – PeterMmm

ответ

3
 
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, что связано с оператором ==. Тест успешно завершен.

+0

Отличный ответ. Спасибо. Не возражаете ли вы добавить ссылку на свой ответ? –

+0

Я постараюсь сделать это скоро, да. – barjak

3
if (path.get(0)!=null && path.get(0).longValue()==-1) 
    System.out.println("first condition works"); 

Если сравнить long примитивы Вы можете использовать метод longValue().
Однако перед вызовом этого метода вы должны проверить объект Long на null.

+0

Добавление объяснения и ссылка на 'longValue()' будут очень полезны для OP. – Maroun

+0

-1L, вероятно, лучший способ пойти как '.get (0)' может возвращать значение null, тогда '.longValue()' будет вызывать NPE – david99world

+0

Вы имеете в виду if (path.get (0) .longValue() == -1L) – MariuszS

3

Ваши два первых случая сравнивают длину с целым числом (из-за автобоксинга), и они никогда не могут быть одним и тем же объектом (естественно).

Ваш последний случай правильный. Используйте equals() при сравнении объектов.

EDIT: Или методы longValue()/intValue() и т.д., если вы хотите использовать оператор ==.

0

Потому что, equals() ожидает Object. Вы не можете передать начальное значение в методе equals(). Таким образом, equals(-1) неверен.

0

Использование

if (path.get(0).equals(-1)) //long value 

Или

if (path.get(0).longValue()==-1) 

Или

if (path.get(0)==-1L) 
1

Заменить if (path.get(0).equals(-1))

с

if (path.get(0).equals(-1L)) 

По умолчанию число обрабатывается как Integer в java, и, таким образом, сравнение не выполняется.

Взгляните на auto-boxing in java для лучшего понимания

Смежные вопросы