การแปลงจำนวนเต็มเป็น Long


108

ฉันต้องการรับค่าของฟิลด์โดยใช้การสะท้อน มันเกิดขึ้นจนฉันไม่แน่ใจเสมอว่าประเภทข้อมูลของฟิลด์คืออะไร สำหรับสิ่งนั้นและเพื่อหลีกเลี่ยงการทำซ้ำรหัสบางอย่างฉันได้สร้างวิธีการต่อไปนี้:

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

และใช้วิธีนี้เช่น:

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

หรือ

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

ปัญหาคือดูเหมือนว่าฉันไม่สามารถส่งIntegerไปที่Long:

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

มีวิธีที่ดีกว่าในการบรรลุเป้าหมายนี้หรือไม่?

ฉันใช้ Java 1.6

คำตอบ:


93

ไม่ได้คุณไม่สามารถส่งIntegerไปLongถึงแม้ว่าคุณสามารถแปลงจากไปint longสำหรับค่าแต่ละค่าซึ่งทราบว่าเป็นตัวเลขและคุณต้องการรับค่า long คุณสามารถใช้:

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

สำหรับอาร์เรย์มันจะยุ่งยากกว่า ...


สำหรับอาร์เรย์ฉันสามารถใช้ a Number[]และวนซ้ำเพื่อสร้างอาร์เรย์ที่พิมพ์ได้อย่างเหมาะสมใช่ไหม
Tiago Veloso

@Tiago: มันขึ้นอยู่กับสิ่งที่วิธีการที่เป็นจริงกลับมา นั่นจะใช้ไม่ได้double[]สำหรับตัวอย่างเช่น แต่จะใช้ได้กับไฟล์Double[].
Jon Skeet

7
ทำไมคุณไม่สามารถส่งจาก Integer เป็น Long ได้?
MrMas

@MrMas: เนื่องจากเป็นประเภทการอ้างอิงแยกกันทั้งคลาสย่อยโดยตรงของNumber. หรือจะพูดอีกอย่างหนึ่ง: คุณเชื่อว่ากฎการแปลงใดที่ช่วยให้คุณแปลงจากกฎหนึ่งไปเป็นอีกกฎหนึ่งได้
Jon Skeet

6
ตกลง. ปัญหาคือการถ่ายทอดทางพันธุกรรม ฉันกำลังคิดในแง่ของความแม่นยำ จำนวนเต็มสามารถแปลงเป็นจำนวนเต็มที่ยาวได้โดยไม่สูญเสียข้อมูล แต่โครงสร้างการสืบทอดไม่มีข้อมูลใด ๆ ที่จะบอกคอมไพเลอร์ได้ว่า
MrMas

134

เพียงแค่:

Integer i = 7;
Long l = new Long(i);

10
NPE จะถูกโยนหากจำนวนเต็มเป็นโมฆะ
ลักซ์

2
ใช้ได้กับintค่า
dARKpRINCE


รหัสนี้ใช้งานได้ (Java โดยปริยายจะแกะกล่องIntegerto intแล้วส่งไปยังlongก่อนที่จะส่งต่อไปยังตัวLong(long)สร้างที่เลิกใช้แล้วในขณะนี้
Ole VV

53
Integer i = 5; //example

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

สิ่งนี้จะหลีกเลี่ยงผลกระทบด้านประสิทธิภาพของการแปลงเป็น String longValue()วิธีการในจำนวนเต็มเป็นเพียงการโยนของค่า int Long.valueOf()วิธีการให้ VM มีโอกาสที่จะใช้เป็นค่าแคช


2
เป็นค่าว่างบันทึก: Long l = i == null? null: i.longValue ()
Adrodoc55

19

ผิดปกติพอฉันพบว่าถ้าคุณแยกวิเคราะห์จากสตริงมันใช้งานได้

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

ชนะ.


1
มันไม่สมเหตุสมผลสำหรับฉัน แต่มันใช้งานได้เหมือนมีเสน่ห์ ขอบคุณมาก!
Bouncner

33
การแนะนำการแปลงสตริงโดยไม่มีเหตุผลเป็นความคิดที่ไม่ดีจริงๆ ... การทำเช่นนี้ไม่มีประโยชน์
Jon Skeet

6
เห็นด้วยกับ @JonSkeet ดีกว่ากับสิ่งนี้: Object i = 10; Long l = ((Number) i) .longValue ();
depsypher

1
วิธีนี้ใช้ได้ดี แต่ค่อนข้างช้าและใช้หน่วยความจำมากกว่าวิธีอื่น ๆ ในการทำเช่นนี้ ...
krispy

1
ดูดีจากมุมมองของนักพัฒนาส่วนหน้า
Ezeewei

8

การแปลงจำนวนเต็มเป็น Long ง่ายมากและหลายวิธีในการแปลง
ตัวอย่างที่ 1

 new Long(your_integer);

ตัวอย่าง 2

Long.valueOf(your_integer); 

ตัวอย่างที่ 3

Long a = 12345L;

ตัวอย่างที่ 4
หากคุณพิมพ์ int เป็นจำนวนเต็มอยู่แล้วคุณสามารถทำได้:

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

8

หากจำนวนเต็มไม่เป็นโมฆะ

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

iจะถูกพิมพ์โดยอัตโนมัติไปยังไฟล์long.

การใช้valueOfแทนการnewอนุญาตให้แคชค่านี้ (หากมีขนาดเล็ก) โดยคอมไพเลอร์หรือ JVM ทำให้โค้ดเร็วขึ้น


ฉันไม่พบเมธอด Long.valueOf (Integer i) สิ่งเดียวที่ฉันพบคือ valueOf (long l), valueOf (String s) และ valueOf (String s, int radix) ตรวจสอบเอกสาร Java8 และ Java9
Andy

1
จำนวนเต็มถูกแปลงโดยปริยายเป็นชนิดยาวดั้งเดิม
lostintranslation

7

แปลงจำนวนเต็มให้เป็น long โดยตรงโดยการเพิ่ม 'L' ต่อท้ายจำนวนเต็ม

Long i = 1234L;

5
ฉันแน่ใจว่าคุณตอบโดยไม่ได้อ่านคำถามทั้งหมด!
Diablo

3
@Diablo คำถามนี้เป็นผลลัพธ์แรกเมื่อค้นหา "int to long" ใน Google คำตอบนี้อาจเป็นประโยชน์กับผู้อื่น
Dimitri W

1
@DimitriW ฉันไม่ได้บอกว่าคำตอบนี้ผิด แต่ฉันบอกว่าคำตอบสำหรับคำถามนี้ผิด คุณพูดถูกสิ่งนี้มีประโยชน์สำหรับผู้ที่ไม่ได้อ่านคำถามและดูคำตอบเท่านั้น
Diablo




1

ตัวแยกวิเคราะห์จากintตัวแปรไปยังlongประเภทจะรวมอยู่ในIntegerคลาส นี่คือตัวอย่าง:

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

คุณสามารถใช้ฟังก์ชันในตัวนี้เพื่อสร้างวิธีการที่แยกวิเคราะห์จากintถึง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

หากคุณไม่ทราบคลาสที่แน่นอนของจำนวนของคุณ ( Integer , Long , Double , อะไรก็ตาม) คุณสามารถส่งไปยังNumberและรับค่า Long ของคุณจากมัน:

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

-1

ในกรณีของ List of type Long ให้เพิ่ม L ต่อท้ายค่า Integer แต่ละค่า

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

-1

พยายามที่จะ ConvertValue โดย Jackson

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

โหวตลงเพราะนี่ไม่ใช่คำตอบที่ดีที่สุดอย่างแน่นอน: โซลูชันนี้เพิ่มความซับซ้อนที่ไม่จำเป็นค่าใช้จ่ายด้านประสิทธิภาพและต้องใช้ไลบรารีเพิ่มเติม (แจ็คสัน)
NickGreen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.