Как мне конвертировать из int в Long в Java?


219

Я продолжаю находить как здесь и Google людей , имеющих проблемы , идущие от longк , intа не наоборот. Тем не менее, я уверен, что я не единственный, кто столкнулся с этим сценарием, прежде чем перейти intк Long.

Единственными другими ответами, которые я нашел, были «Просто установите его как 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а объект, для которого я храню эту информацию, требует порядковый номер как Long.


for (long i = 0; i <myList.size (); ++ i) тоже работает
Instantsoup

@Instantsoup Да, это будет работать для цикла, но, как я указал в нижней части моего вопроса, ArrayList, с которым я работаю, требует примитива int для указания позиции индекса
Ghosty

long longValue = intValue | 0L;
Даниэль Джипа

То , что я сделал это: бросок intк longпервому, а затем назначить longна Long. Напримерint x = 2; Long y = (long)x;
Эрик Ван

Ответы:


244

Обратите внимание, что есть различие между приведением к longи приведением к Long. Если вы приведете к long(примитивное значение), то оно должно быть автоматически помещено в Long(ссылочный тип, который его оборачивает).

В качестве альтернативы вы можете использовать newдля создания экземпляра Long, инициализируя его intзначением.


31
Чтобы продемонстрировать, что сказал Earwicker, вы можете вызвать Long.valueOf (i), который занимает long, но расширяет int и возвращает вам объект Long.
Grundlefleck

1
Автобокс предпочтительнее, потому что не обязательно Longкаждый раз создавать новый объект.
Майкл Майерс

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

4
Автобокс делает то же самое. Кстати, между -127 и 128.
Даниэль Эрвикер

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

194

Используйте следующее: Long.valueOf(int);.


5
Обратите внимание, так как это сгенерирует исключение NullPointerException, если вы получаете объект Integer, который является нулевым.
Will824

2
правильно, если я не прав, я думал, что ответ старый, потому что я не могу найти методLong.valueOf(int) !!
Шариф

5
@ will824 - примитивная переменная int не может быть нулевой.
Рондо

1
@shareef - см. комментарий Сергея - но я думаю, что этот метод переводит int в long, а автобоксы с Long ... так кажется избыточным
Rondo

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

Как насчет

int myInt = 88;

// не скомпилируется

Long myLong = myInt;

// Компилирует и сохраняет ненулевой дух int. Лучший актерский состав - вообще не актерский состав . Конечно, в вашем случае использования могут потребоваться значения Long и возможные значения NULL. Но если int или другие long - ваш единственный вход, и ваш метод может быть изменен, я бы предложил этот подход.

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 - Long, а JSpinner был настроен на возврат Long. В конце концов мне пришлось написать эту функцию:

    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()возвращает Object, который на самом деле является a Long, вам определенно нужно только поставить (Long)приведение впереди. Также попробуйте поставить точку останова на вашем чеке для int.classи long.classт. Д. Он когда-нибудь попадал? И если у вас есть объект, похожий на число, он будет поддерживать java.util.Number, поэтому приведите его к этому и вызовите longValueметод. В этом случае нет необходимости проходить через строку. Так что эту функцию можно немного упростить, даже если вам также нужно иметь дело со строками. (Часть проблемы здесь - плохая справочная документация для JSpinner).
Даниэль Уорвикер

1
Я тоже закончил тем, что делал что-то подобное. Я не был уверен, какое число я получу, и был готов преобразовать его в Long, не заботясь об эффективности, но не желая избегать шаблонов.
Profiterole


0

Как только есть только метод Long.valueOf(long), приведение от intк longбудет выполнено неявно в случае использования Long.valueOf(intValue).

Более понятный способ сделать это

Integer.valueOf(intValue).longValue()

longValueэто просто (long), так что единственное, что вы «получаете» здесь - Integerэто внутренний кеш.
Мартин Шредер,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.