Перетворення цілого числа в довгий


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 кидається, якщо ціле число є нульовим
люкс

2
Працює для intцінностей.
dARKpRINCE

11
Long.valueof слід використовувати: stackoverflow.com/questions/2974561/new-integer-vs-valueof
Щасливчик Люк

Цей код працює (Java неявно розблоковує Integerдо, 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 ();
депсифер

1
Цей метод працює чудово, але відносно повільний і використовує більше пам’яті, ніж інші методи цього ...
krispy

1
виглядає чудово з точки зору розробника на передньому кінці
Ezeewei

8

Перетворення цілого числа у довгий дуже простий та багато способів перетворення цього
прикладу 1

 new Long(your_integer);

Приклад 2

Long.valueOf(your_integer); 

Приклад 3

Long a = 12345L;

Приклад 4
Якщо у вас уже введено int як Integer, ви можете зробити це:

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

7

Перетворити ціле число безпосередньо в довге, додавши "L" до кінця Integer.

Long i = 1234L;

5
Я впевнений, що ви відповіли, не прочитавши все запитання!
Діабло

3
@Diablo це питання є першим результатом при пошуку "int to long" в Google, ця відповідь може стати в нагоді іншим
Dimitri W

1
@DimitriW Я не кажу, що ця відповідь є неправильною, але я кажу, що відповідь на це питання є неправильною. Ви маєте рацію, це корисно тим людям, які не читають питання і дивляться лише на відповідь.
Діабло

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
Ціле число неявно перетворюється на примітивний довгий тип.
програв переклад


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

Спробуйте перетворитиValue від Джексона

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.