logo

Как преобразовать Integer в Long в Java: обход ClassCastException

Быстрый ответ

Преобразование объекта типа Integer в Long в Java можно выполнить с использованием метода longValue(). Можете выбрать одну из двух представленных ниже стратегий:

Возможность №1 — прямое преобразование:

Java
Скопировать код
Integer myInt = 123;
Long myLong = myInt.longValue(); // Прямое преобразование

Возможность №2 — с помощью автоупаковки:

Java
Скопировать код
Integer myInt = 123;
Long myLong = Long.valueOf(myInt); // Автоупаковка java

Оба варианта преобразуют Integer в Long, сохраняя численное значение.

Ошибки при преобразовании и принципы работы

Прямое преобразование из Integer в Long в Java недопустимо. Вы не сможете выполнить следующее:

Java
Скопировать код
Integer myInt = 123;
// Long myLong = (Long) myInt; // Ошибка компиляции в Java

Не рекомендуется использовать приведение типов в подобных ситуациях.

Работа с особыми случаями

Обработка null-значений и проверка типов

Прежде чем преобразовывать, убедитесь, что ваш объект Integer не равен null и что он действительно является экземпляром класса Integer. Это поможет вам избежать выброса исключений NullPointerException или ClassCastException:

Java
Скопировать код
if (myInt != null && myInt instanceof Integer) {
    Long myLong = myInt.longValue(); // Предварительная проверка перед конвертацией
}

Преобразование массивов

При переводе массива Integer в массив Long удобно использовать Stream API Java. Это позволяет весьма эффективно и элегантно обрабатывать преобразование:

Java
Скопировать код
Integer[] integerArray = {1, 2, 3};
Long[] longArray = Arrays.stream(integerArray).map(Integer::longValue).toArray(Long[]::new); // Примение Streams для преобразования

Вопросы производительности

Метод Long.valueOf() по-умолчанию кэширует определенные числовые значения. Это может быть эффективнее при преобразовании некоторых целых чисел:

Java
Скопировать код
Integer myInt = 10;
Long myLong = Long.valueOf(myInt.intValue()); // Использование кэшированного значения для улучшения производительности

Избегайте ненужных преобразований

Не стоит применять преобразования через строковое представление числа, так как это может негативно сказаться на производительности вашей программы:

Java
Скопировать код
// Неэффективный метод, приводящий к избыточному преобразованию в строку
Long myLong = Long.parseLong(myInt.toString());

Визуализация

Java
Скопировать код
Integer intObject = 42;
Long longObject = intObject.longValue(); // От распаковывания к автоупаковке
Процесс:
Integer 📦 ➡️ int 🔢 ➡️ long 🔢 ➡️ Long 📦

Мы извлекаем значение int из Integer и автоупаковываем его в новый Long:

Markdown
Скопировать код
Integer (📦) в int (🔢) – Распаковываем и получаем чистое значение.
int (🔢) в Long (📦) – Java заботливо предоставляет нам новую упаковку.

Расширенные способы преобразования

Преобразование с использованием Reflection API

В специфических случаях можно воспользоваться Reflection API для преобразования, но важно тщательно проверять соответствие типов:

Java
Скопировать код
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, но обратное утверждение не всегда верно — это не является универсальным решением.

Полезные материалы

  1. Integer (Java Platform SE 8 ) — Документация JavaDoc по классу Integer.
  2. Long (Java Platform SE 8 ) — Документация JavaDoc по классу Long.
  3. Časté převedení long na int v Java – Stack Overflow — Обсуждения сообщества и примеры приведения типов.
  4. Автоупаковка и распаковка (The Java™ Tutorials) — О автоматическом преобразовании типов в Java.
  5. Глава 5. Преобразования и контексты — Правила преобразования примитивных типов в Java для любителей формального подхода.
  6. Преобразование типов в Java с примерами – GeeksforGeeks — Практические примеры преобразования типов в Java.