Это действительно похоже на ошибку в 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))
следует отклонить.
Хорошо. Java автоматически распаковывает типы Integer/Long. Все хорошо. Но расширение должно быть «int long, float или double», но не так, как я делаю это в примере ('long -> int') – fl00r
Подождите, вы правы. Кажется, это происходит наоборот. Это немного странно. –
@ fl00r Интересно, что, когда я пробую это в Java, 'javac' жалуется на' new Integer (new Long (1)) 'и принимает' новый Long (новый Integer (1)) ', как и ожидалось. –