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.

Tiago Veloso
sumber

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

Jon Skeet
sumber
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
134

Secara sederhana:

Integer i = 7;
Long l = new Long(i);
vahid kh
sumber
10
NPE dilempar jika Integer adalah null
lux
2
Bekerja untuk intnilai - nilai.
dARKpRINCE
11
Long.valueof harus digunakan: stackoverflow.com/questions/2974561/new-integer-vs-valueof
luckyluke
Kode ini berfungsi (Java secara implisit membuka kotak Integerke intdan kemudian mentransmisikan ke longsebelum meneruskan ke Long(long)konstruktor yang sekarang sudah tidak digunakan lagi .
Ole VV
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.

MacDonald yang kaya
sumber
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.

Segera
sumber
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();
Naresh Kumar
sumber
7

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

Long i = 1234L;
Jeff Johny
sumber
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.

hilang dalam terjemahan
sumber
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
5
((Number) intOrLongOrSomewhat).longValue()
max.kuzmentsov
sumber
2

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

Integer intVal = 1;
Long longVal = (long) (int) intVal
Steven Spungin
sumber
1
new Long(Integer.longValue());

atau

new Long(Integer.toString());
Pavlo Zvarych
sumber
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;
}
Bremsstrahlung
sumber
0

Ini tidak aman

Number tmp = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance);
Long value1 = tmp == null ? null : tmp.longValue();
adkisson
sumber
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();
kaisar
sumber
-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);
Joydeep Dutta
sumber
-1

Cobalah untuk mengubah Nilai oleh Jackson

ObjectMapper mapper = new ObjectMapper()
Integer a = 1;
Long b = mapper.convertValue(a, Long.class)
lemonzone2010
sumber
Diturunkan karena ini jelas bukan jawaban terbaik: solusi ini menambah kompleksitas yang tidak perlu, overhead kinerja, dan memerlukan perpustakaan tambahan (Jackson)
NickGreen