2015-05-10 2 views
0

Следующий код дает ошибку (с IDEA), в то время как я думаю, что это не должно.Невозможно разрешить метод equals (java.lang.Long)

Long[] a = {0L, 0L}; 
Long[] b = {1L, 1L}; 
if((a[0] + a[1]).equals(b[1])) 
    System.out.println("Equal"); 

Says cannot resolve method equals(java.lang.Long). Но он хорошо работает с if(a[0].equals(b[0])). Я думал, что оператор плюс вернет объект Long.

Почему он не возвращает объект Long, и как мы можем использовать Long c = a[0] + a[1], если он не возвращает длинный объект? Или почему мы не можем использовать equals?

ответ

1

Почему это кажется, что это не возвращает Long объект?

15.18.2. Additive Operators (+ and -) for Numeric Types говорит нам, что:

Binary числовое расширение выполняется над операндами.

Тип аддитивного выражения для числовых операндов - это продвинутый тип его операндов.

И 5.6.2. Binary Numeric Promotion говорит нам, что:

Если какой-либо операнд имеет ссылочный тип, он подвергается конверсии распаковки.

Что это означает, что результат Long + Long является long, и мы не можем назвать методы примитивного типа.

И как мы в состоянии использовать Long c = a[0] + a[1] если он не возвращает Long объект?

Для Long c = a[0] + a[1]long по заказу.

1

a[0] + a[1] добавлены как примитивные типы и не являются autoboxed (примитивы не имеют методов, следовательно, ошибка времени компиляции). Вам нужно либо явно завернуть их в объект:

(new Long(a[0] + a[1])).equals(b[1]) 

... или полагаться на unboxing из b[1] в примитивного типа

a[0] + a[1] == b[1] 
1

Все, что вам нужно сделать, это заменить эту строку:

if((a[0] + a[1]).equals(b[1])) 

для этого:

if(a[0] + a[1] == b[1]) 



EDIT:
Да, вы правы - равно не может взять сумму долгот в качестве параметра, из других ответов я могу видеть, что это потому, что они примитивные значения. Важно знать, что мы учимся каждый день :)

1
(a[0] + a[1]) 

приводит примитивныеlong, а не в ссылочного типа java.lang.Long.

Если вы пытаетесь использовать элемент примитивного типа, это приводит к ошибке времени компиляции.

Вы можете использовать Autoboxing, чтобы преобразовать результат сложения обратно Long так:

((Long)(a[0] + a[1])).equals(b[1]) 

Long c = (a[0] + a[1]); делает что-то подобное, что «внутри», то есть на самом деле работает так:

Long c = (Long)((long)a[0] + (long)a[1]); 

 

Вы также можете просто удалить b[1]:

(a[0] + a[1]) == b[1] 
Смежные вопросы