Як перетворити з int в Long на Java?


219

Я продовжую знаходити і тут, і в людей, які мають проблеми з переходом longдо, intа не навпаки. Тим НЕ менше , я впевнений , що я не єдиний, який потрапило в цей сценарій , перш ніж від intдо Long.

Єдині інші відповіді, які я знайшов, були "Просто встановіть це як Довге в першу чергу", який насправді не відповідає на це питання.

Я спочатку намагався робити кастинг, але отримую " Cannot cast from int to Long"

for (int i = 0; i < myArrayList.size(); ++i ) {
    content = new Content();
    content.setDescription(myArrayList.get(i));
    content.setSequence((Long) i);
    session.save(content);
}

Як ви можете собі уявити, я трохи здивований, я затримався, intоскільки деякий вміст надходить як ArrayListі особа, для якої я зберігаю цю інформацію, вимагає порядковий номер як Довгий.


for (long i = 0; i <myList.size (); ++ i) також працює
Instantsoup

@Instantsoup Так, це буде працювати для циклу, але, як я вказав у нижній частині свого запитання, ArrayList, з яким я працюю, вимагає примітивної int, коли вказувати, яку позицію індексу отримати
Ghosty

long longValue = intValue | 0л;
Даніель Джипа

Те , що я зробив це: кидок intдо longпершого, а потім призначити longна Long. наприкладint x = 2; Long y = (long)x;
Ерік Ван

Відповіді:


244

Зауважте, що існує різниця між атрибутом до longі групою для Long. Якщо ви перейдете до long(примітивне значення), воно повинно бути автоматично введено у вікно Long(тип посилання, який його завершує).

Можна також використати newдля створення екземпляра Long, ініціалізуючи його зі intзначенням.


31
Щоб продемонструвати те, що Earwicker сказав, ви можете зателефонувати Long.valueOf (i), що займає багато часу, але розширить int і поверне вам довгий об'єкт.
Grundlefleck

1
Автобоксинг є кращим, оскільки не обов’язково Longкожен раз створювати новий об’єкт.
Майкл Майерс

2
(Попередження: решта цього коментаря - здогадки та здогадки) Якщо значення, надані Long.valueOf (), падають між 0 і 128, що є дуже поширеним явищем, і він повертає кешований екземпляр, чи буде це краще для автобоксингу? (Я можу задати нове запитання, якщо ви вважаєте, що воно того варте ...)
Grundlefleck

4
Автобоксинг робить те саме, що і те. До речі, це між -127 та 128.
Даніель Ервікер

6
@Grundlefleck: Автобоксинг використовує Long.valueOf()(якщо я правильно пам’ятаю), тому різниці взагалі не буде. Мій коментар був у відповідь на відповідь, а не на ваш коментар.
Майкл Майерс

194

Використовуйте наступне: Long.valueOf(int);.


5
Зверніть увагу, оскільки це створить NullPointerException, якщо ви отримуєте об'єкт Integer, який є null.
will824

2
правильно, якщо я подумав, що я міг би бути відповіддю, старий, бо я не можу знайти методLong.valueOf(int) !!
shareef

5
@ will824 - примітивна змінна "int" не може бути нульовою.
Рондо

1
@shareef - дивіться коментар serg - але я думаю, що цей метод кидає int на довгі, які автобокси з Long ... так здається зайвим
Рондо

1
@ Рондо банки, про Integerщо він сказав.
Мойра

17

Якщо ти вже маєш int як Integer, ти можеш це зробити:

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


6

У мене є ця маленька іграшка, яка також стосується не загальних інтерфейсів. Я все в порядку, кидаючи ClassCastException, якщо подача неправильна (ОК і щаслива)

public class TypeUtil {
    public static long castToLong(Object o) {
        Number n = (Number) o;
        return n.longValue();
    }
}

6

На Java ви можете:

 int myInt=4;
 Long myLong= new Long(myInt);

у вашому випадку це було б:

content.setSequence(new Long(i));

6

Як щодо

int myInt = 88;

// Не збирається

Long myLong = myInt;

// Складає і зберігає ненульовий дух int. Найкращий акторський склад взагалі не є акторським складом . Звичайно, у випадку використання може знадобитися довге та можливе значення NULL. Але якщо int або інші довги - ваш єдиний вклад, і ваш метод можна змінити, я б запропонував такий підхід.

long myLong = myInt;

// Компілюється - це найефективніший спосіб і дає зрозуміти, що вихідне значення є і ніколи не буде NULL.

Long myLong = (long) myInt;

3

Ми отримаємо велике значення, використовуючи Numberпосилання.

public static long toLong(Number number){
    return number.longValue();
}

Він працює для всіх типів чисел, ось тест:

public static void testToLong() throws Exception {
    assertEquals(0l, toLong(0));   // an int
    assertEquals(0l, toLong((short)0)); // a short
    assertEquals(0l, toLong(0l)); // a long
    assertEquals(0l, toLong((long) 0)); // another long
    assertEquals(0l, toLong(0.0f));  // a float
    assertEquals(0l, toLong(0.0));  // a double

}


2

У мене були великі проблеми з цим. Я просто хотів:

thisBill.IntervalCount = jPaidCountSpinner.getValue();

Де IntervalCount - Довгий, а JSpinner був налаштований повернути Лонг. Врешті-решт мені довелося написати цю функцію:

    public static final Long getLong(Object obj) throws IllegalArgumentException {
    Long rv;

    if((obj.getClass() == Integer.class) || (obj.getClass() == Long.class) || (obj.getClass() == Double.class)) {
        rv = Long.parseLong(obj.toString());
    }
    else if((obj.getClass() == int.class) || (obj.getClass() == long.class) || (obj.getClass() == double.class)) {
        rv = (Long) obj;
    }
    else if(obj.getClass() == String.class) {
        rv = Long.parseLong(obj.toString());
    }
    else {
        throw new IllegalArgumentException("getLong: type " + obj.getClass() + " = \"" + obj.toString() + "\" unaccounted for");
    }

    return rv;
}

що, здається, робить трюк. Жодної кількості простого кастингу, жодне з перерахованих вище рішень не працювало для мене. Дуже засмучує.


1
якщо jPaidCountSpinner.getValue()повертає Об'єкт, який насправді є Long, вам, безумовно, потрібно лише поставити (Long)акторський склад спереду. Також спробуйте поставити на чек точку перерви int.classабо long.classт. Д. Це колись вдарило? І якщо у вас є об'єкт, схожий на число, він підтримуватиме java.util.Number, тому киньте це і викличте longValueметод. У цьому випадку не потрібно переходити через рядок. Тож цю функцію можна було б трохи спростити, навіть якщо вам також потрібно мати справу з рядками. (Частина проблеми тут полягає в поганій довідковій документації для JSpinner).
Даніель Ервікер

1
Я теж закінчив щось подібне. Я не був впевнений, яке число я отримаю, і був готовий перетворити його на Лонг, не маючи турботи про ефективність, але хотів уникнути котла.
Profiterole


0

Щойно з'явиться лише метод Long.valueOf(long), передача з " intдо" longбуде зроблена неявно у разі використання Long.valueOf(intValue).

Більш чіткий спосіб це зробити

Integer.valueOf(intValue).longValue()

longValueце лише a (long), тому єдине, що ви тут "отримуєте" - це Integerвнутрішній кеш.
Мартін Шредер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.