Преобразование целого числа в длинное


108

Мне нужно получить значение поля с помощью отражения. Так получилось, что я не всегда уверен, что это за тип данных поля. Для этого и во избежание некоторого дублирования кода я создал следующий метод:

@SuppressWarnings("unchecked")
private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable {
  Field f = classUnderTest.getDeclaredField(processFieldName(var));
  f.setAccessible(true);
  T value = (T) f.get(runtimeInstance);

  return value;
}

И используйте этот метод, например:

Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);

или

Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance);

Проблема заключается в том, что я не могу показаться , чтобы бросить Integerна Long:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

Есть ли лучший способ добиться этого?

Я использую Java 1.6.

Ответы:


91

Нет, вы не можете бросить Integerна Long, даже если вы можете конвертировать intв long. Для отдельного значения, которое, как известно, является числом, и вы хотите получить длинное значение, вы можете использовать:

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp.longValue();

Для массивов будет сложнее ...


Для массивов я могу использовать a Number[]и цикл над ним, чтобы создать правильно типизированный массив, верно?
Tiago Veloso

@Tiago: Это зависит от того, что на самом деле возвращает метод . Это не будет работать для double[], например, но будет работать для Double[].
Джон Скит

7
Почему вы не можете преобразовать целое число в длинное?
MrMas

@MrMas: Поскольку это отдельные ссылочные типы, оба являются прямыми подклассами Number. Или, другими словами: какое правило преобразования, по вашему мнению , позволяет вам преобразовывать одно в другое?
Джон Скит

6
Хорошо. Проблема в наследовании. Я думаю о точности. Целое число можно преобразовать в длинное без потери информации. Но в структуре наследования нет информации, которая могла бы сообщить об этом компилятору.
MrMas

134

Просто:

Integer i = 7;
Long l = new Long(i);

10
NPE выбрасывается, если целое число равно null
люкс,

2
Работает для intценностей.
DARKpRINCE

11
Следует использовать long.valueof: stackoverflow.com/questions/2974561/new-integer-vs-valueof
luckyluke

Этот код работает (Java неявно распаковывает объект Integerto, intа затем выполняет приведение к нему, longпрежде чем перейти к теперь устаревшему Long(long)конструктору.
Ole VV

53
Integer i = 5; //example

Long l = Long.valueOf(i.longValue());

Это позволяет избежать снижения производительности при преобразовании в String. longValue()Метод Integer просто слепок значения Int. Этот Long.valueOf()метод дает виртуальной машине возможность использовать кешированное значение.


2
Чтобы быть нулевым, сохраните: Long l = i == null? null: i.longValue ()
Adrodoc55

19

Как ни странно, я обнаружил, что если вы разбираете строку, она работает.

 int i = 0;
 Long l = Long.parseLong(String.valueOf(i));
 int back = Integer.parseInt(String.valueOf(l));

Выиграть.


1
Для меня это не имеет абсолютно никакого смысла, но работает как шарм. Большое спасибо!
Bouncner

33
Вводить преобразование строк без причины - действительно плохая идея ... от этого просто нет никакой пользы.
Джон Скит,

6
Согласитесь с @JonSkeet, лучше с этим: Object i = 10; Long l = ((Number) i) .longValue ();
depsypher

1
Этот метод работает нормально, но относительно медленный и использует больше памяти, чем другие методы для этого ...
krispy

1
отлично выглядит с точки зрения
фронтенд-

8

Преобразование целого числа в длинное Очень простой и множество способов преобразования этого
примера 1

 new Long(your_integer);

Пример 2

Long.valueOf(your_integer); 

Пример 3

Long a = 12345L;

Пример 4
Если у вас уже есть тип int как целое число, вы можете сделать это:

Integer y = 12;
long x = y.longValue();

7

Преобразуйте целое число напрямую в длинное, добавив "L" в конец целого числа.

Long i = 1234L;

5
Я уверен, что вы ответили, не прочитав весь вопрос!
Diablo,

3
@Diablo, этот вопрос - первый результат поиска "от int до long" в Google, этот ответ может быть полезен другим
Димитрий В,

1
@DimitriW Я не говорю, что этот ответ неверен, но я говорю, что ответ на этот вопрос неверен. Вы правы, это полезно тем людям, которые не читают вопрос и смотрят только на ответ.
Diablo

7

Если целое число не равно нулю

Integer i;
Long long = Long.valueOf(i);

iбудет автоматически преобразован в тип файла long.

Использование valueOfвместо newпозволяет кэшировать это значение (если оно мало) компилятором или JVM, что приводит к ускорению кода.


Я не могу найти метод Long.valueOf (Integer i), единственные, что я нашел, - это valueOf (long l), valueOf (String s) и valueOf (String s, int radix). Проверено на наличие документов Java8 и Java9.
Энди

1
Целое число неявно преобразуется в примитивный длинный тип.
lostintranslation


2

Если вы знаете, что целое число не равно NULL, вы можете просто сделать это:

Integer intVal = 1;
Long longVal = (long) (int) intVal


1

В класс включен парсер от intпеременных к longтипу Integer. Вот пример:

int n=10;
long n_long=Integer.toUnsignedLong(n);

Вы можете легко использовать эту встроенную функцию для создания метода, который анализирует от intдо long:

    public static long toLong(int i){
    long l;
    if (i<0){
        l=-Integer.toUnsignedLong(Math.abs(i));
    }
    else{
        l=Integer.toUnsignedLong(i);
    }
    return l;
}

0

Это нулевое значение

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();

0

Если вы не знаете точный класс своего числа ( Integer , Long , Double , что угодно), вы можете преобразовать его в Number и получить от него свое длинное значение:

Object num = new Integer(6);
Long longValue = ((Number) num).longValue();

-1

В случае списка типа Long, добавление L в конец каждого целочисленного значения

List<Long> list = new ArrayList<Long>();
list  = Arrays.asList(1L, 2L, 3L, 4L);

-1

Попробуйте convertValue от Джексона

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)

Проголосовали против, потому что это определенно не лучший ответ: это решение добавляет ненужную сложность, накладные расходы на производительность и требует дополнительной библиотеки (Джексон)
NickGreen
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.