Как преобразовать Integer в Long в Java: обход ClassCastException
Быстрый ответ
Преобразование объекта типа Integer
в Long
в Java можно выполнить с использованием метода longValue()
. Можете выбрать одну из двух представленных ниже стратегий:
Возможность №1 — прямое преобразование:
Integer myInt = 123;
Long myLong = myInt.longValue(); // Прямое преобразование
Возможность №2 — с помощью автоупаковки:
Integer myInt = 123;
Long myLong = Long.valueOf(myInt); // Автоупаковка java
Оба варианта преобразуют Integer
в Long
, сохраняя численное значение.
Ошибки при преобразовании и принципы работы
Прямое преобразование из Integer
в Long
в Java недопустимо. Вы не сможете выполнить следующее:
Integer myInt = 123;
// Long myLong = (Long) myInt; // Ошибка компиляции в Java
Не рекомендуется использовать приведение типов в подобных ситуациях.
Работа с особыми случаями
Обработка null-значений и проверка типов
Прежде чем преобразовывать, убедитесь, что ваш объект Integer
не равен null
и что он действительно является экземпляром класса Integer
. Это поможет вам избежать выброса исключений NullPointerException
или ClassCastException
:
if (myInt != null && myInt instanceof Integer) {
Long myLong = myInt.longValue(); // Предварительная проверка перед конвертацией
}
Преобразование массивов
При переводе массива Integer
в массив Long
удобно использовать Stream API Java. Это позволяет весьма эффективно и элегантно обрабатывать преобразование:
Integer[] integerArray = {1, 2, 3};
Long[] longArray = Arrays.stream(integerArray).map(Integer::longValue).toArray(Long[]::new); // Примение Streams для преобразования
Вопросы производительности
Метод Long.valueOf()
по-умолчанию кэширует определенные числовые значения. Это может быть эффективнее при преобразовании некоторых целых чисел:
Integer myInt = 10;
Long myLong = Long.valueOf(myInt.intValue()); // Использование кэшированного значения для улучшения производительности
Избегайте ненужных преобразований
Не стоит применять преобразования через строковое представление числа, так как это может негативно сказаться на производительности вашей программы:
// Неэффективный метод, приводящий к избыточному преобразованию в строку
Long myLong = Long.parseLong(myInt.toString());
Визуализация
Integer intObject = 42;
Long longObject = intObject.longValue(); // От распаковывания к автоупаковке
Процесс:
Integer 📦 ➡️ int 🔢 ➡️ long 🔢 ➡️ Long 📦
Мы извлекаем значение int
из Integer
и автоупаковываем его в новый Long
:
Integer (📦) в int (🔢) – Распаковываем и получаем чистое значение.
int (🔢) в Long (📦) – Java заботливо предоставляет нам новую упаковку.
Расширенные способы преобразования
Преобразование с использованием Reflection API
В специфических случаях можно воспользоваться Reflection API для преобразования, но важно тщательно проверять соответствие типов:
Field field = myObject.getClass().getDeclaredField("myIntField");
if (field.getType().equals(Integer.class)) {
Integer intValue = (Integer) field.get(myObject);
Long longValue = intValue.longValue(); // Использование рефлексии
}
Соизмеримость типов
Диапазоны значений Integer
(±2.1 миллиарда) и Long
(±9.2 квинтиллиона) существенно отличаются. Необходимо помнить, что Integer
всегда поместится в Long
, но обратное утверждение не всегда верно — это не является универсальным решением.
Полезные материалы
- Integer (Java Platform SE 8 ) — Документация JavaDoc по классу
Integer
. - Long (Java Platform SE 8 ) — Документация JavaDoc по классу
Long
. - Časté převedení long na int v Java – Stack Overflow — Обсуждения сообщества и примеры приведения типов.
- Автоупаковка и распаковка (The Java™ Tutorials) — О автоматическом преобразовании типов в Java.
- Глава 5. Преобразования и контексты — Правила преобразования примитивных типов в Java для любителей формального подхода.
- Преобразование типов в Java с примерами – GeeksforGeeks — Практические примеры преобразования типов в Java.