Как мне конвертировать из 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.

Ghosty
источник
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);.

Serg
источник
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();
ОАРВТ
источник
12

использование

new Long(your_integer);

или

Long.valueOf(your_integer);
Мохаммадреза Таваколи
источник
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. Лучший актерский состав - вообще не актерский состав . Конечно, в вашем случае использования могут потребоваться значения 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;
}

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

MaskedCoder
источник
1
Если jPaidCountSpinner.getValue()возвращает Object, который на самом деле является a Long, вам определенно нужно только поставить (Long)приведение впереди. Также попробуйте поставить точку останова на вашем чеке для int.classи long.classт. Д. Он когда-нибудь попадал? И если у вас есть объект, похожий на число, он будет поддерживать java.util.Number, поэтому приведите его к этому и вызовите longValueметод. В этом случае нет необходимости проходить через строку. Так что эту функцию можно немного упростить, даже если вам также нужно иметь дело со строками. (Часть проблемы здесь - плохая справочная документация для JSpinner).
Даниэль Уорвикер
1
Я тоже закончил тем, что делал что-то подобное. Я не был уверен, какое число я получу, и был готов преобразовать его в Long, не заботясь об эффективности, но не желая избегать шаблонов.
Profiterole
2
 //Suppose you have int and you wan to convert it to Long
 int i=78;
 //convert to Long
 Long l=Long.valueOf(i)
Вирендра Сингх
источник
0

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

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

Integer.valueOf(intValue).longValue()
Станислав Цепа
источник
longValueэто просто (long), так что единственное, что вы «получаете» здесь - Integerэто внутренний кеш.
Мартин Шредер,