2015-10-27 3 views
1
(Integer. 1) 

Как я понимаю, это то же самое, как следующий код Java:Передача java.lang.Long в Integer конструктор

new Integer(1) 

Так что теперь у меня есть следующая конструкция

(Integer. (Long. 1)) 
#=> 1 

Как эта работа? Класс Java Integer получил two constructors, и они не принимают Long.

Кстати, после не работает:

(Long. (Integer. 1)) 

ответ

1

Это действительно похоже на ошибку в Clojure. Для Java это наоборот. Это связано с CLJ-445, запросом «улучшения», которому более пяти лет. Пожалуй, лучше всего пинговать эту проблему с помощью этого тривиального примера.


new Long(new Integer(1)) должен быть приемлемым из-за сочетания unboxing и widening.

С распаковкой (обратной величиной Autoboxing), некоторые объекты неявно преобразуется в примитивные тип:

Преобразование объекта типа обертки (целое число) в соответствующем примитивное значение (INT) называется распаковкой. Компилятор Java применяет распаковку, когда объектом класса оболочки является:

  • Передано как параметр методу, ожидающему значения соответствующего примитивного типа.
  • Назначается переменной соответствующего примитивного типа.

В этом примере, Integer объектов неявно сводятся к int и Long объектов неявно сводятся к long.

С расширением примитивные типы могут быть неявно преобразованы в «более широкие» примитивные типы, когда это возможно без потери информации. Это означает, что int можно преобразовать в long, но не наоборот, поэтому new Integer(new Long(1)) следует отклонить.

+0

Хорошо. Java автоматически распаковывает типы Integer/Long. Все хорошо. Но расширение должно быть «int long, float или double», но не так, как я делаю это в примере ('long -> int') – fl00r

+0

Подождите, вы правы. Кажется, это происходит наоборот. Это немного странно. –

+0

@ fl00r Интересно, что, когда я пробую это в Java, 'javac' жалуется на' new Integer (new Long (1)) 'и принимает' новый Long (новый Integer (1)) ', как и ожидалось. –

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