Làm cách nào để chuyển đổi từ int sang Long trong Java?


219

Tôi tiếp tục tìm thấy cả ở đây và những người Google gặp rắc rối từ đó longđến intvà không phải là cách khác. Tuy nhiên, tôi chắc chắn tôi không phải là người duy nhất gặp phải tình huống này trước khi đi intđến Long.

Câu trả lời duy nhất khác mà tôi tìm thấy là "Chỉ cần đặt nó ở vị trí đầu tiên" mà thực sự không giải quyết được câu hỏi.

Ban đầu tôi đã thử casting nhưng tôi nhận được " 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);
}

Như bạn có thể tưởng tượng tôi hơi bối rối, tôi bị mắc kẹt intkhi sử dụng một số nội dung như là một ArrayListthực thể và tôi đang lưu trữ thông tin này yêu cầu số thứ tự là Dài.


for (long i = 0; i <myList.size (); ++ i) cũng hoạt động
Instantsoup

@Instantsoup Có, nó sẽ hoạt động cho vòng lặp, nhưng như tôi đã chỉ định ở cuối câu hỏi, ArrayList tôi đang làm việc yêu cầu int nguyên thủy khi chỉ định vị trí chỉ mục nào sẽ nhận được
Ghosty

longValue = intValue | 0L;
Daniel Jipa

Những gì tôi đã làm là: diễn viên intđến longđầu tiên, sau đó gán longcho Long. ví dụint x = 2; Long y = (long)x;
Eric Wang

Câu trả lời:


244

Lưu ý rằng có một sự khác biệt giữa diễn viên đến longvà diễn viên Long. Nếu bạn truyền tới long(một giá trị nguyên thủy) thì nó sẽ được tự động đóng hộp thành một Long(kiểu tham chiếu bao bọc nó).

Bạn có thể sử dụng thay thế newđể tạo một thể hiện Long, khởi tạo nó với intgiá trị.


31
Để chứng minh những gì Earwicker nói bạn có thể gọi Long.valueOf (i), việc này sẽ mất nhiều thời gian nhưng sẽ mở rộng một int và trả lại cho bạn một đối tượng Long.
Grundlefleck

1
Autoboxing là thích hợp hơn, bởi vì nó không nhất thiết phải tạo một Longđối tượng mới mỗi lần.
Michael Myers

2
. (Tôi có thể hỏi một câu hỏi mới nếu bạn nghĩ nó đáng giá ...)
Grundlefleck

4
Autoboxing làm điều tương tự như vậy. Nhân tiện, nó nằm trong khoảng từ -27 đến 128.
Daniel Earwicker

6
@Grundlefleck: Autoboxing sử dụng Long.valueOf()(nếu tôi nhớ chính xác), do đó sẽ không có sự khác biệt nào cả. Nhận xét của tôi là trả lời câu trả lời, không phải bình luận của bạn.
Michael Myers

193

Sử dụng như sau : Long.valueOf(int);.


5
Xem ra, vì điều này sẽ tạo ra một NullPulumException nếu bạn đang nhận một đối tượng Integer là null.
will824

2
đúng nếu tôi là người mà tôi nghĩ có thể là câu trả lời cũ vì tôi không thể tìm ra phương phápLong.valueOf(int) !!
shareef

5
@ will824 - một biến 'int' nguyên thủy không thể rỗng.
Rondo

1
@shareef - xem bình luận của serg - nhưng tôi nghĩ phương pháp này biến int thành một hộp dài tự động với một ... dài nên có vẻ dư thừa
Rondo

1
@Rondo một lon Integer, đó là những gì anh ấy nói.
Moira

17

Nếu bạn đã nhập int dưới dạng Số nguyên, bạn có thể thực hiện việc này:

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


6

Tôi có đồ chơi nhỏ này, cũng liên quan đến các giao diện không chung chung. Tôi ổn với việc ném ClassCastException nếu nạp sai (OK và hạnh phúc)

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

6

Trong Java, bạn có thể làm:

 int myInt=4;
 Long myLong= new Long(myInt);

trong trường hợp của bạn, nó sẽ là:

content.setSequence(new Long(i));

6

Làm thế nào về

int myInt = 88;

// Sẽ không biên dịch

Long myLong = myInt;

// Biên dịch và giữ lại tinh thần không phải NULL của int. Các diễn viên tốt nhất là không có diễn viên nào cả . Tất nhiên, trường hợp sử dụng của bạn có thể yêu cầu các giá trị NULL dài và có thể. Nhưng nếu int hoặc các long khác là đầu vào duy nhất của bạn và phương thức của bạn có thể được sửa đổi, tôi sẽ đề xuất phương pháp này.

long myLong = myInt;

// Biên dịch, là cách hiệu quả nhất và làm rõ rằng giá trị nguồn, sẽ và sẽ không bao giờ là NULL.

Long myLong = (long) myInt;

3

Chúng ta sẽ nhận được giá trị dài bằng cách sử dụng Numbertài liệu tham khảo.

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

Nó hoạt động cho tất cả các loại số, đây là một thử nghiệm:

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

Tôi đã có rất nhiều rắc rối với điều này. Tôi chỉ muốn:

thisBill.IntervalCount = jPaidCountSpinner.getValue();

Trong đó IntervalCount là một Long và JSpinner được đặt để trả về một Long. Cuối cùng, tôi đã phải viết chức năng này:

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

mà dường như để làm các mẹo. Không có số lượng đúc đơn giản, không có giải pháp nào ở trên làm việc cho tôi. Rất bực bội.


1
nếu jPaidCountSpinner.getValue()trả về một đối tượng thực tế là a Long, bạn chắc chắn chỉ cần đặt một (Long)diễn viên ở phía trước. Ngoài ra, hãy thử đặt một điểm dừng trên séc của bạn int.classhoặc long.classvv. Nó có bao giờ đánh nó không? Và nếu bạn có một đối tượng giống như số, nó sẽ hỗ trợ java.util.Number, vì vậy hãy đặt nó vào đó và gọi longValuephương thức. Không cần phải đi qua một chuỗi trong trường hợp đó. Vì vậy, chức năng này có thể được đơn giản hóa khá nhiều, ngay cả khi bạn cũng cần phải xử lý chuỗi. (Một phần của vấn đề ở đây là tài liệu tham khảo xấu cho JSpinner).
Daniel Earwicker

1
Tôi cũng đã kết thúc việc làm như thế này. Tôi không chắc chắn mình sẽ nhận được loại số nào và sẵn sàng chuyển đổi nó thành Long mà không quan tâm đến hiệu quả nhưng muốn tránh nồi hơi.
Profiterole

2
 //Suppose you have int and you wan to convert it to Long
 int i=78;
 //convert to Long
 Long l=Long.valueOf(i)

0

Ngay khi chỉ có phương thức Long.valueOf(long), việc chuyển từ intsang longsẽ được thực hiện hoàn toàn trong trường hợp sử dụng Long.valueOf(intValue).

Cách rõ ràng hơn để làm điều này là

Integer.valueOf(intValue).longValue()

longValuechỉ là một (long), vì vậy điều duy nhất bạn "đạt được" ở đây là Integerbộ nhớ cache bên trong.
Martin Schröder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.