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.

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 ...


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


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ść.


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ć.


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();

7

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

Long i = 1234L;

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.


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


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


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

0

To jest bezpieczne

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

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();

-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);

-1

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

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.