Mengubah Integer menjadi Long


108

Saya perlu mendapatkan nilai bidang menggunakan refleksi. Kebetulan saya tidak selalu yakin apa tipe data dari bidang itu. Untuk itu, dan untuk menghindari beberapa duplikasi kode, saya telah membuat metode berikut:

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

Dan gunakan metode ini seperti:

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

atau

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

Masalahnya adalah saya tidak bisa melakukan cast Integerke Long:

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

Adakah cara yang lebih baik untuk mencapai ini?

Saya menggunakan Java 1.6.

Jawaban:


91

Tidak, Anda tidak dapat mentransmisikan Integerke Long, meskipun Anda dapat mengonversi dari intmenjadi long. Untuk nilai individu yang dikenal sebagai angka dan Anda ingin mendapatkan nilai panjang, Anda dapat menggunakan:

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

Untuk array, itu akan lebih rumit ...


Untuk array saya bisa menggunakan a Number[]dan loop di atasnya untuk membuat array yang diketik dengan tepat, bukan?
Tiago Veloso

@Tiago: Itu tergantung pada metode apa yang sebenarnya kembali. Yang tidak akan bekerja untuk double[]misalnya, tetapi akan bekerja untuk Double[].
Jon Skeet

7
Mengapa Anda tidak bisa melakukan cast dari Integer ke Long?
MrMas

@MrMas: Karena merupakan tipe referensi terpisah, keduanya merupakan subkelas langsung dari Number. Atau dengan kata lain: yang konversi aturan yang Anda percaya tidak membiarkan Anda mengkonversi dari satu ke yang lain?
Jon Skeet

6
Baik. Masalahnya adalah warisan. Saya berpikir dalam hal presisi. Bilangan bulat dapat diubah menjadi bilangan bulat panjang tanpa kehilangan informasi. Tetapi struktur pewarisan tidak memiliki informasi apa pun yang akan memberi tahu compiler tentang hal itu.
MrMas


53
Integer i = 5; //example

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

Ini untuk menghindari kinerja hit dari konversi ke String. The longValue()metode dalam Integer hanya cast dari nilai int. The Long.valueOf()Metode memberikan vm kesempatan untuk menggunakan nilai cache.


2
Untuk menyimpan nol: Panjang l = i == null? null: i.longValue ()
Adrodoc55

19

Anehnya saya menemukan bahwa jika Anda mengurai dari string itu berhasil.

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

Menang.


1
Ini sama sekali tidak masuk akal bagi saya, tetapi berfungsi seperti pesona. Terima kasih banyak!
Bouncner

33
Memperkenalkan konversi string tanpa alasan adalah ide yang sangat buruk ... tidak ada manfaatnya melakukan ini.
Jon Skeet

6
Setuju dengan @JonSkeet, lebih baik dengan ini: Object i = 10; Long l = ((Number) i) .longValue ();
depsypher

1
Metode ini berfungsi dengan baik tetapi relatif lambat dan menggunakan lebih banyak memori daripada metode lain untuk melakukan ini ...
krispy

1
tampak hebat dari perspektif pengembang front end
Ezeewei

8

Mengubah Integer menjadi Panjang Sangat Sederhana dan banyak cara untuk mengubah
Contoh 1 itu

 new Long(your_integer);

Contoh 2

Long.valueOf(your_integer); 

Contoh 3

Long a = 12345L;

Contoh 4
Jika Anda sudah memiliki int yang diketik sebagai Integer, Anda dapat melakukan ini:

Integer y = 12;
long x = y.longValue();

7

Ubah bilangan bulat langsung menjadi panjang dengan menambahkan 'L' di akhir bilangan bulat.

Long i = 1234L;

5
Saya yakin Anda telah menjawab tanpa membaca seluruh pertanyaan!
Diablo

3
@Diablo pertanyaan ini adalah hasil pertama saat mencari "int to long" di Google, jawaban ini mungkin berguna bagi orang lain
Dimitri W

1
@DimitriW Saya tidak mengatakan jawaban ini salah, Tapi saya mengatakan jawaban untuk pertanyaan ini salah. Anda benar, Ini berguna bagi orang-orang yang tidak membaca pertanyaan dan hanya melihat jawabannya.
Diablo

7

Jika Integer tidak null

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

iakan secara otomatis typecast ke a long.

Menggunakan valueOfalih-alih newmengizinkan caching nilai ini (jika kecil) oleh kompilator atau JVM, menghasilkan kode yang lebih cepat.


Saya tidak dapat menemukan metode Long.valueOf (Integer i), satu-satunya yang saya temukan adalah valueOf (long l), valueOf (String s) dan valueOf (String s, int radix). Memeriksa dokumen Java8 dan Java9.
Andy

1
Integer secara implisit diubah menjadi tipe primitif panjang.
lostintranslation


2

Jika Anda tahu bahwa Integer bukan NULL, Anda dapat melakukan ini:

Integer intVal = 1;
Long longVal = (long) (int) intVal


1

Parser dari intvariabel ke longtipe disertakan di Integerkelas. Berikut ini contohnya:

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

Anda dapat dengan mudah menggunakan fungsi bawaan ini untuk membuat metode yang mem-parsing dari intmenjadi 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

Ini tidak aman

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

0

Jika Anda tidak mengetahui kelas pasti dari bilangan Anda ( Integer , Long , Double , apa pun), Anda dapat mentransmisikan ke Number dan mendapatkan nilai panjang Anda darinya:

Object num = new Integer(6);
Long longValue = ((Number) num).longValue();

-1

Dalam kasus Jenis Daftar Panjang, Menambahkan L ke akhir setiap nilai Integer

List<Long> list = new ArrayList<Long>();
list  = Arrays.asList(1L, 2L, 3L, 4L);

-1

Cobalah untuk mengubah Nilai oleh Jackson

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

Diturunkan karena ini jelas bukan jawaban terbaik: solusi ini menambah kompleksitas yang tidak perlu, overhead kinerja, dan memerlukan perpustakaan tambahan (Jackson)
NickGreen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.