ฉันจะแปลงจาก int เป็น Long ใน Java ได้อย่างไร


219

ฉันให้หาทั้งที่นี่และ Google คนที่มีปัญหาไปจากlongไปintและไม่วิธีอื่น ๆ แต่ฉันแน่ใจว่าฉันไม่ได้เป็นเพียงคนเดียวที่ได้ทำงานในสถานการณ์นี้ก่อนที่จะจากไปintLong

คำตอบอื่น ๆ ที่ฉันพบคือ "เพียงตั้งเป็นลองในตอนแรก" ซึ่งไม่ได้ตอบคำถาม

ตอนแรกฉันพยายามคัดเลือกนักแสดง แต่ได้รับ " Cannot cast from int to Long"

for (int i = 0; i < myArrayList.size(); ++i ) {
    content = new Content();
    content.setDescription(myArrayList.get(i));
    content.setSequence((Long) i);
    session.save(content);
}

อย่างที่คุณสามารถจินตนาการได้ว่าฉันสับสนเล็กน้อยฉันติดอยู่intเนื่องจากเนื้อหาบางอย่างเข้ามาเป็นส่วนหนึ่งArrayListและเอนทิตีที่ฉันเก็บข้อมูลนี้ต้องใช้หมายเลขลำดับเป็นแบบยาว


สำหรับ (long i = 0; i <myList.size (); ++ i) ทำงานด้วย
Instantsoup

@Instantsoup ใช่ว่าจะทำงานให้ห่วง แต่ที่ผมระบุไว้ที่ด้านล่างของคำถามของฉัน ArrayList ฉันทำงานกับต้อง int ดั้งเดิมเมื่อระบุว่าตำแหน่งดัชนีที่จะได้รับ
Ghosty

long longValue = intValue | 0L;
Daniel Jipa

สิ่งที่ฉันได้คือการโยนintไปlongก่อนจากนั้นจึงกำหนดที่จะlong Longเช่นint x = 2; Long y = (long)x;
Eric Wang

คำตอบ:


244

ทราบว่ามีความแตกต่างระหว่างการโยนไปและโยนไปlong Longหากคุณส่งไปที่long(ค่าดั้งเดิม) จากนั้นควรจะได้รับกล่องโดยอัตโนมัติไปที่Long(ประเภทการอ้างอิงที่ล้อมรอบ)

คุณสามารถใช้newเพื่อสร้างตัวอย่างของการLongเริ่มต้นมันด้วยintค่า


31
เพื่อแสดงให้เห็นถึงสิ่งที่ Earwicker พูดว่าคุณสามารถเรียก Long.valueOf (i) ซึ่งใช้เวลานาน แต่จะขยาย int และคืนกลับเป็นวัตถุ Long
Grundlefleck

1
Autoboxing ดีกว่าเพราะไม่จำเป็นต้องสร้างLongวัตถุใหม่ทุกครั้ง
Michael Myers

2
(คำเตือน: ส่วนที่เหลือของความคิดเห็นนี้เป็นการคาดเดาและคาดเดา) หากค่าที่มอบให้กับ Long.valueOf () อยู่ระหว่าง 0 ถึง 128 ซึ่งเป็นเรื่องธรรมดามากและจะส่งคืนอินสแตนซ์แคช (ผมอาจจะถามคำถามใหม่ถ้าคุณคิดว่ามันคุ้มค่า ... )
Grundlefleck

4
Autoboxing ทำเช่นเดียวกัน โดยวิธีการที่มันเป็นระหว่าง -127 และ 128
แดเนียล Earwicker

6
@ Grundlefleck: การใช้ Autoboxing Long.valueOf()(ถ้าฉันจำได้อย่างถูกต้อง) ดังนั้นจะไม่มีความแตกต่างเลย ความคิดเห็นของฉันเป็นคำตอบที่ตอบไม่ใช่ความคิดเห็นของคุณ
Michael Myers

194

ใช้สิ่งต่อไปนี้: Long.valueOf(int);.


5
ระวังเพราะจะสร้าง NullPointerException ถ้าคุณได้รับออบเจ็กต์ Integer ซึ่งเป็นโมฆะ
will824

2
ถูกต้องถ้าฉันไม่คิดว่าฉันอาจจะเป็นคำตอบคือเก่าเพราะฉันไม่สามารถหาวิธีLong.valueOf(int) !!
shareef

5
@ will824 - ตัวแปร 'int' ดั้งเดิมไม่สามารถเป็นค่าว่างได้
Rondo

1
@shareef - ดูความคิดเห็นของ serg - แต่ฉันคิดว่าวิธีนี้มันทำให้ int เป็นเวลานานซึ่ง autoboxes ที่มี Long ... ดังนั้นดูเหมือนจะซ้ำซ้อน
Rondo

1
@Rondo an Integercan ซึ่งเป็นสิ่งที่เขาพูด
Moira

17

หากคุณมี int พิมพ์เป็นจำนวนเต็มคุณสามารถทำได้:

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


6

ฉันมีของเล่นเล็ก ๆ นี้ซึ่งเกี่ยวข้องกับอินเตอร์เฟสที่ไม่ใช่ทั่วไป ฉันโอเคถ้ามีการโยน ClassCastException ถ้าป้อนผิด (ตกลงและมีความสุข)

public class TypeUtil {
    public static long castToLong(Object o) {
        Number n = (Number) o;
        return n.longValue();
    }
}


6

เกี่ยวกับ

int myInt = 88;

// จะไม่คอมไพล์

Long myLong = myInt;

// คอมไพล์และเก็บวิญญาณที่ไม่ใช่ค่า NULL ของ int นักแสดงที่ดีที่สุดคือไม่มีนักแสดงเลย แน่นอนกรณีการใช้งานของคุณอาจต้องใช้ค่า NULL ที่ยาวและเป็นไปได้ แต่ถ้า int หรือ longs อื่นเป็นของคุณเท่านั้นและวิธีการของคุณสามารถแก้ไขได้ฉันจะแนะนำวิธีนี้

long myLong = myInt;

// คอมไพล์เป็นวิธีที่มีประสิทธิภาพมากที่สุดและทำให้ชัดเจนว่าค่าซอร์สคือและจะไม่เป็น NULL

Long myLong = (long) myInt;

3

เราจะได้ค่ายาวโดยใช้Numberการอ้างอิง

public static long toLong(Number number){
    return number.longValue();
}

มันใช้งานได้กับหมายเลขทุกประเภทนี่คือการทดสอบ:

public static void testToLong() throws Exception {
    assertEquals(0l, toLong(0));   // an int
    assertEquals(0l, toLong((short)0)); // a short
    assertEquals(0l, toLong(0l)); // a long
    assertEquals(0l, toLong((long) 0)); // another long
    assertEquals(0l, toLong(0.0f));  // a float
    assertEquals(0l, toLong(0.0));  // a double

}


2

ฉันมีปัญหาอย่างมากกับเรื่องนี้ ฉันแค่อยากจะ:

thisBill.IntervalCount = jPaidCountSpinner.getValue();

โดยที่ IntervalCount เป็น Long และ JSpinner ถูกตั้งค่าให้ส่งคืน Long ในที่สุดฉันก็ต้องเขียนฟังก์ชั่นนี้:

    public static final Long getLong(Object obj) throws IllegalArgumentException {
    Long rv;

    if((obj.getClass() == Integer.class) || (obj.getClass() == Long.class) || (obj.getClass() == Double.class)) {
        rv = Long.parseLong(obj.toString());
    }
    else if((obj.getClass() == int.class) || (obj.getClass() == long.class) || (obj.getClass() == double.class)) {
        rv = (Long) obj;
    }
    else if(obj.getClass() == String.class) {
        rv = Long.parseLong(obj.toString());
    }
    else {
        throw new IllegalArgumentException("getLong: type " + obj.getClass() + " = \"" + obj.toString() + "\" unaccounted for");
    }

    return rv;
}

ซึ่งดูเหมือนจะทำเคล็ดลับ ไม่ต้องใช้การหล่อแบบเรียบง่ายไม่มีวิธีแก้ปัญหาใดที่ได้ผลสำหรับฉัน น่าผิดหวังมาก


1
หากjPaidCountSpinner.getValue()ส่งคืนออบเจ็กต์ที่เป็นจริงLongแล้วคุณจะต้อง(Long)ส่งนักแสดงหน้าต่อไปเท่านั้น ลองใส่เบรกพอยต์บนเช็คของคุณint.classหรือlong.classอื่น ๆ และถ้าคุณมีวัตถุที่มีลักษณะเหมือนจำนวนมากมันจะรองรับjava.util.Numberดังนั้นจึงโยนมันไปที่นั้นและเรียกใช้longValueเมธอด ไม่จำเป็นต้องผ่านสตริงในกรณีนั้น ดังนั้นฟังก์ชั่นนี้อาจลดความซับซ้อนลงได้เล็กน้อยแม้ว่าคุณจะต้องจัดการกับสตริง (ส่วนหนึ่งของปัญหาที่นี่เป็นเอกสารอ้างอิงที่ไม่ดีสำหรับJSpinner)
Daniel Earwicker

1
ฉันก็ลงเอยด้วยการทำอะไรแบบนี้ ฉันไม่แน่ใจว่าฉันจะได้รับหมายเลขชนิดใดและยินดีที่จะแปลงเป็น Long โดยมีความกังวลด้านประสิทธิภาพเล็กน้อย แต่ต้องการหลีกเลี่ยงการใช้หม้อไอน้ำ
Profiterole


0

ทันทีที่มีวิธีการเท่านั้น Long.valueOf(long)หล่อจากintไปจะทำโดยปริยายในกรณีของการใช้longLong.valueOf(intValue)

วิธีที่ชัดเจนกว่านี้คือ

Integer.valueOf(intValue).longValue()

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