Я постоянно нахожу здесь и в 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.
Обратите внимание, что существует разница между приведением к long
и приведением к Long
. Если вы приводите к long
(примитивному значению), то оно должно быть автоматически приведено к Long
(ссылочному типу, который его обертывает).
В качестве альтернативы можно использовать new
для создания экземпляра Long
, инициализируя его значением int
.
У меня есть маленькая игрушка, которая также связана с использованием не универсальных интерфейсов. Я'м хорошо бросает ClassCastException если кормить неправильно (ОК и счастлива)
public class TypeUtil {
public static long castToLong(Object o) {
Number n = (Number) o;
return n.longValue();
}
}
В Java вы можете сделать:
int myInt=4;
Long myLong= new Long(myInt);
в вашем случае это будет:
content.setSequence(new Long(i));
Как Насчет
int myInt = 88;
// Не будет компилироваться
Long myLong = myInt;
// Собирает и сохраняет ненулевое дух инт. Лучшие литой это не бросит в всех. Конечно, в вашем случае могут потребовать длительного и возможные нулевые значения. Но если инт или другой жаждет только вход, и ваш способ может быть изменен, я бы предложил такой подход.
long myLong = myInt;
// Компилируется, является наиболее эффективным способом, и становится ясно, что источник ценности, и никогда не будет null.
Long myLong = (long) myInt;
1,new Long(intValue);
2,Long.valueOf(intValue);
Мы получим длинное значение, используя "номер ссылки".
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
}
//Suppose you have int and you wan to convert it to Long
int i=78;
//convert to Long
Long l=Long.valueOf(i)
У меня было много неприятностей с этим. Я просто хотел:
thisBill.IntervalCount = jPaidCountSpinner.getValue();
Где IntervalCount долго, и экран был установлен, чтобы вернуться долго. В итоге мне пришлось написать эту функцию:
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;
}
который, кажется, сделать трюк. Никакое количество простых отливок, ни один из вышеупомянутых решений работал для меня. Очень неприятно.
Как только есть единственный способ долго.метод valueOf(длинный), отлитых из типа
intв
длинныебудет сделано неявно в случае использования "длинных".метод valueOf(сертификата от его закодированной формы)
.
Более четкий способ сделать это
Integer.valueOf(intValue).longValue()