Zamiana liczby całkowitej na długą

108

Muszę uzyskać wartość pola za pomocą odbicia. Tak się składa, że ​​nie zawsze jestem pewien, jaki jest typ danych pola. W tym celu i aby uniknąć powielania kodu, stworzyłem następującą metodę:

@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;
}

I użyj tej metody jak:

Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);

lub

Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance);

Problem polega na tym, że nie mogę przesyłać Integerdo Long:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

Czy jest lepszy sposób na osiągnięcie tego?

Używam Java 1.6.

Tiago Veloso
źródło

Odpowiedzi:

91

Nie, nie możesz przesyłać Integerna Long, mimo że możesz konwertować z intna long. Dla pojedynczej wartości, o której wiadomo, że jest liczbą i chcesz uzyskać długą wartość, możesz użyć:

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp.longValue();

W przypadku tablic będzie to trudniejsze ...

Jon Skeet
źródło
W przypadku tablic mogę użyć Number[]i pętli nad nią, aby utworzyć odpowiednio wpisaną tablicę, prawda?
Tiago Veloso
@Tiago: To zależy od tego, jaka metoda faktycznie zwraca. To nie będzie działać dla double[]na przykład, ale będzie pracować dla Double[].
Jon Skeet,
7
Dlaczego nie możesz rzucić z liczby całkowitej na długą?
MrMas
@MrMas: Ponieważ są to oddzielne typy odwołań, obie bezpośrednie podklasy Number. Albo inaczej: która reguła konwersji, twoim zdaniem , pozwala ci nawracać się od jednej osoby do drugiej?
Jon Skeet,
6
Dobrze. Problemem jest dziedziczenie. Myślę w kategoriach precyzji. Liczbę całkowitą można przekształcić w długą liczbę całkowitą bez utraty informacji. Ale struktura dziedziczenia nie zawiera żadnych informacji, które powiedziałyby to kompilatorowi.
MrMas
134

Po prostu:

Integer i = 7;
Long l = new Long(i);
vahid kh
źródło
10
luks
2
Działa dla intwartości.
dARKpRINCE
11
Należy użyć Long.valueof: stackoverflow.com/questions/2974561/new-integer-vs-valueof
luckyluke
Ten kod działa (Java niejawnie rozpakowuje Integerto, inta następnie rzutuje na longprzed przekazaniem do Long(long)konstruktora, który jest przestarzały .
Ole VV
53
Integer i = 5; //example

Long l = Long.valueOf(i.longValue());

Pozwala to uniknąć pogorszenia wydajności konwersji na ciąg. longValue()Metoda Integer jest tylko obsada wartości int. Long.valueOf()Metoda daje VM możliwość korzystania z pamięci podręcznej wartość.

Rich MacDonald
źródło
2
Aby być null save: Long l = i == null? null: i.longValue ()
Adrodoc55
19

Co dziwne, odkryłem, że jeśli przeanalizujesz ciąg znaków, to działa.

 int i = 0;
 Long l = Long.parseLong(String.valueOf(i));
 int back = Integer.parseInt(String.valueOf(l));

Zdobyć.

Zaraz
źródło
1
Nie ma to dla mnie absolutnie żadnego sensu, ale działa jak urok. Wielkie dzięki!
Bouncner
33
Wprowadzenie konwersji ciągów bez powodu jest naprawdę złym pomysłem ... po prostu nie ma z tego żadnej korzyści.
Jon Skeet,
6
Zgadzam się z @JonSkeet, lepiej z tym: Object i = 10; Long l = ((Number) i) .longValue ();
depsypher
1
Ta metoda działa dobrze, ale jest stosunkowo powolna i zużywa więcej pamięci niż inne metody, aby to zrobić ...
krispy,
1
wygląda świetnie z punktu widzenia programisty front-end
Ezeewei
8

Zamiana liczb całkowitych na długie, bardzo proste i wiele sposobów konwersji tego
przykładu 1

 new Long(your_integer);

Przykład 2

Long.valueOf(your_integer); 

Przykład 3

Long a = 12345L;

Przykład 4
Jeśli masz już int wpisaną jako liczbę całkowitą, możesz to zrobić:

Integer y = 12;
long x = y.longValue();
Naresh Kumar
źródło
7

Zamień liczbę całkowitą bezpośrednio na długość, dodając „L” na końcu liczby całkowitej.

Long i = 1234L;
Jeff Johny
źródło
5
Jestem pewien, że odpowiedziałeś bez czytania całego pytania!
Diablo,
3
@Diablo to pytanie jest pierwszym wynikiem wyszukiwania „int to long” w Google, ta odpowiedź może być przydatna dla innych
Dimitri W
1
@DimitriW Nie mówię, że ta odpowiedź jest błędna, ale mówię, że odpowiedź na to pytanie jest nieprawidłowa. Masz rację, jest to przydatne dla osób, które nie czytają pytania i patrzą tylko na odpowiedź.
Diablo
7

Jeśli liczba całkowita nie jest null

Integer i;
Long long = Long.valueOf(i);

izostanie automatycznie rzutowany do pliku long.

Użycie valueOfzamiast newumożliwia buforowanie tej wartości (jeśli jest mała) przez kompilator lub maszynę JVM, co skutkuje szybszym kodem.

utracony sens po tłumaczeniu
źródło
Nie mogę znaleźć metody Long.valueOf (Integer i), jedyne, które znajduję, to valueOf (long l), valueOf (String s) i valueOf (String s, int radix). Sprawdzono pod kątem dokumentacji Java8 i Java9.
Andy,
1
Liczba całkowita jest niejawnie konwertowana na pierwotny typ długi.
Lostintranslation
5
((Number) intOrLongOrSomewhat).longValue()
max.kuzmentsov
źródło
2

Jeśli wiesz, że liczba całkowita nie jest równa NULL, możesz po prostu zrobić to:

Integer intVal = 1;
Long longVal = (long) (int) intVal
Steven Spungin
źródło
1
new Long(Integer.longValue());

lub

new Long(Integer.toString());
Pavlo Zvarych
źródło
1

Klasa zawiera parser od intzmiennych do longtypu Integer. Oto przykład:

int n=10;
long n_long=Integer.toUnsignedLong(n);

Możesz łatwo użyć tej wbudowanej funkcji, aby utworzyć metodę, która analizuje od intdo 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;
}
Bremsstrahlung
źródło
0

To jest bezpieczne

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();
adkisson
źródło
0

Jeśli nie znasz dokładnej klasy swojego numeru ( Integer , Long , Double , cokolwiek), możesz rzucić na Number i uzyskać z niego swoją wartość long:

Object num = new Integer(6);
Long longValue = ((Number) num).longValue();
kajzer
źródło
-1

W przypadku listy typu Long, dodanie L na końcu każdej wartości całkowitej

List<Long> list = new ArrayList<Long>();
list  = Arrays.asList(1L, 2L, 3L, 4L);
Joydeep Dutta
źródło
-1

Spróbuj przeliczyć wartość według Jacksona

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)
lemonzone2010
źródło
Negocjowane, ponieważ zdecydowanie nie jest to najlepsza odpowiedź: to rozwiązanie dodaje niepotrzebnej złożoności, narzutu wydajności i wymaga dodatkowej biblioteki (Jackson)
NickGreen