Tôi không biết lý do tại sao nó được đề cập đến các kiểu dữ liệu miễn là một int
Nó không phải là. Bạn nên học cách tin cậy các thông điệp trình biên dịch (đặc biệt là khi chúng từ các trình biên dịch hiện đại, không biên dịch và không phải trình biên dịch C/C++ cổ). Trong khi ngôn ngữ mà họ nói có thể khó giải mã vào những thời điểm, họ thường không nói dối bạn.
Hãy nhìn vào nó một lần nữa:
Các đen của int 9223372036854775807 là ra khỏi phạm vi.
Lưu ý, rằng nó không đề cập đến biến của bạn testLong
hoặc loại long
bất cứ nơi nào, do đó, nó không về khởi tạo. Vấn đề dường như xảy ra ở một số điểm khác.
Bây giờ cho phép điều tra một số các bộ phận của thông điệp: (! Mà không phải là những gì bạn muốn)
int
cho chúng ta biết rằng anh muốn đối xử với một cái gì đó như một giá trị int
- "ra khỏi phạm vi "là khá rõ ràng: một cái gì đó không phải là trong phạm vi dự kiến (có lẽ là của
int
)
- " chữ ": bây giờ đó là thú vị: một chữ là gì?
Tôi sẽ để lại danh sách ấm cúng để nói về văn học trong giây lát: literals là nơi bạn có một số giá trị trong mã của mình. Có String
literals, int
literals, class
literals và v.v.Mỗi khi bạn đề cập đến một giá trị rõ ràng trong mã của mình, đó là một chữ.
Vì vậy, nó không thực sự dai dẳng bạn về tuyên bố biến, nhưng số lượng chính nó, giá trị là những gì nó dai dẳng bạn về.
Bạn có thể dễ dàng xác minh điều này bằng cách sử dụng cùng một chữ trong một bối cảnh mà một long
và một int
là như nhau có thể chấp nhận:
System.out.println(9223372036854775807);
PrintStream.println
có thể mất một trong hai an int
hoặc a long
(hoặc khá nhiều bất cứ điều gì khác). Vì vậy, mã nên được tốt, phải không?
Không. Có thể là nên, nhưng theo quy tắc, là không ổn.
Vấn đề là that "some digits" is defined to be an int
literal và do đó phải nằm trong phạm vi được xác định bởi int
.
Nếu bạn muốn viết một long
đen, sau đó bạn phải chắc rằng rõ ràng bằng cách thêm các L
(hoặc thấp hơn trường hợp l
, nhưng tôi cao đề nghị bạn luôn luôn sử dụng các biến thể chữ hoa, bởi vì nó dễ dàng hơn để đọc và khó hơn để nhầm lẫn với một số 1
).
Lưu ý rằng một vấn đề tương tự xảy ra với float
(postfix F
/f
) và double
(postfix D
/d
).
Side lưu ý: bạn sẽ nhận ra rằng không có byte
hoặc short
literals và bạn vẫn có thể gán giá trị (thường int
literals) để byte
và short
biến: đó là có thể do quy tắc đặc biệt trong § 5.2 about Assignment Converson: chúng cho phép chuyển nhượng liên tục các biểu thức của loại lớn hơn là byte
, short
, char
hoặc int
nếu giá trị nằm trong phạm vi loại.
Nhân tiện: bạn đang sử dụng trình biên dịch nào? Cả Eclipse và trình biên dịch JDK của Sun đều cung cấp các thông báo lỗi khác nhau (theo ý kiến của tôi) cho vấn đề này. –