2015-02-05 11 views
5

Tôi có một phương pháp mà nhận được một long loại parameher, và tôi cố gắng gọi nó đi qua 1:Java: tại sao loại nguyên thủy "dài" không chấp nhận một số đơn giản?

contato.setId(1); 

Và tôi nhận được:

The method setId(Long) in the type Contato is not applicable for the arguments (int). 

Nhưng, không phải là một số 1 dài cũng? Không phải là nó nằm trong phạm vi dài ??

PS: Chỉ cần nói, tôi đã giải quyết được vấn đề với mã này:

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

Nó chỉ là một câu hỏi didatic.

+2

Nếu phương pháp này chấp nhận một chút-l 'long', nó muốn làm việc tốt; nó chỉ là int literals không thể autobox trực tiếp đến 'Long'. –

+0

có thể trùng lặp của [Làm thế nào một phao biến thành một đôi ở đây?] (Http://stackoverflow.com/q/3680879/217324) - câu trả lời của tôi có giải thích các quyết định đằng sau giới hạn autoboxing được đề cập trong bình luận của Louis –

Trả lời

5

long là một kiểu dữ liệu có chứa 64bits (không nên nhầm lẫn với các đối tượng Long!) So với một int (32 bit), vì vậy bạn không thể sử dụng phân đơn giản từ int để long. Xem: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Để xem làm thế nào để khai báo kiểu dữ liệu khác nhau, bạn nên kiểm tra đặc biệt là following table:

Datatype Default Value 
byte  0 
short  0 
int   0 
long  0L 
float  0.0f 
double  0.0d 
char  '\u0000' 
Object  null 
boolean  false 

Vì vậy, đối với trường hợp của bạn, long cần được khai báo với số tiếp theo là một L, ví dụ:

long x = 100L; 

Hơn nữa, làm những gì bạn đang làm với autoboxing:

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

không chỉ là không cần thiết - nó cũng rất lãng phí. Vì vậy, ví dụ, nếu bạn sẽ làm điều đó trong một vòng lặp (nhiều lần) mã của bạn sẽ chậm hơn theo thứ tự độ lớn!

7

Bạn nên sử dụng contato.setId(1L); (chú ý chữ "L" hậu tố)

hiểu theo nghĩa đen là "1" đại diện cho một giá trị nguyên thủy int, được đúc để một lớp java.lang.Integer wrapper.

2

Long không phải là loại nguyên thủy, long là. Khi sử dụng các lớp wrapper thay vì các loại nguyên thủy, bạn cần phải chỉ ra một cách rõ ràng để trình biên dịch rằng đối số truyền vào là một long bằng cách thêm L hậu tố:

contato.setId(1L); 

Hoặc bạn chỉ có thể thay đổi setId phương pháp để nó thay vào đó, tham số long nguyên thủy.

+1

Có cũng có khả năng vốn "L" trên loại đối số setId là lỗi đánh máy, và sửa chữa chính xác là làm cho nó mất một nguyên thủy 'long'. –

0

setId có vốn L Long, là trình bao bọc của Java quanh chữ thường-long (số nguyên AKA 64 bit). Vì lý do này, Java dễ dàng biết cách chuyển đổi một số long thành Long mà không cần bạn làm gì đặc biệt. Vì vậy, giống như các câu trả lời khác nói, bạn có thể chỉ cần thực hiện setId(1L), cung cấp cho nó long, mà nó dễ dàng chuyển đổi thành Long.

Tuy nhiên, nếu bạn phải sử dụng 322 bit int, trước tiên bạn phải chuyển đổi nó thành long hoặc Long, vì vậy Java biết cách xử lý. Bạn thấy đấy, Java không biết cách chuyển đổi chữ thường-i int thành chữ hoa-L Long, chỉ thành chữ hoa-I Integer (lớp bao bọc xung quanh int).

Vì vậy, giả sử tên int của bạn là i, bạn có thể sử dụng các cũng như:

setId((long)i);   // Cast your int to a long, which Java can turn into a Long 
setId((Long)(long)i); // Cast your int to a long, then that long to a Long 
setId(new Long(i));  // Create a new Long object based on your int 
setId(Long.valueOf(i)); // Get the Long version of your int 
Các vấn đề liên quan