Đặt Java giá trị ngắn


114

Tôi đang viết một đoạn mã nhỏ trong J2ME. Tôi có một lớp học với một phương pháp setTableId(Short tableId). Bây giờ khi tôi cố gắng viết setTableId(100)nó cho lỗi thời gian biên dịch. Làm cách nào để đặt giá trị ngắn mà không cần khai báo một biến ngắn khác?

Khi cài đặt Longgiá trị tôi có thể sử dụng setLongValue(100L)và nó hoạt động. Vậy, Lý nghĩa ở đây là gì và ký tự cho Shortgiá trị là gì?

Cảm ơn


Lchỉ là một hậu tố được sử dụng để chỉ một longnghĩa đen.
missfaktor

Câu trả lời:


174

Trong Java, các ký tự số nguyên có kiểu int theo mặc định. Đối với một số loại khác, bạn có thể hậu tố các literal với một chữ cái case-insensitive như L, D, Fđể xác định một chặng đường dài, đôi, hoặc phao, tương ứng. Lưu ý rằng thực tế phổ biến là sử dụng chữ hoa để dễ đọc hơn.

Đặc tả ngôn ngữ Java không cung cấp cùng một đường cú pháp cho kiểu byte hoặc kiểu ngắn. Thay vào đó, bạn có thể khai báo nó như vậy bằng cách sử dụng truyền rõ ràng:

byte foo = (byte)0;
short bar = (short)0;

Trong setLongValue(100L)cuộc gọi phương thức của bạn , bạn không nhất thiết phải bao gồm Lhậu tố vì trong trường hợp này, nghĩa đen int tự động được mở rộng thành dài. Điều này được gọi là mở rộng chuyển đổi nguyên thủy trong Đặc tả ngôn ngữ Java.


16
Ngoài ra còn có các hậu tố cho các kiểu khác: d/ Dmake a doublef/ Fmake a float!
Joachim Sauer

6
Ngoài ra: các ký tự phù hợp với kích thước không cần phải đúc: hai ví dụ của bạn cũng hoạt động mà không cần đúc.
Joachim Sauer

Bạn đúng trên cả hai. Tôi nên nói rõ hơn rằng tôi đang nói về các ký tự số nguyên ở đây, không phải về các ký tự dấu phẩy động.
Lauri

4
@Joachim: Không cần cast chỉ cho J5 +; Thật không may, J2ME vẫn còn ở J4 (một J4 bị tước bỏ nghiêm trọng).
Lawrence Dol

2
@JoachimSauer, "vừa với kích thước" nghĩa là gì? Tôi hỏi vì tôi chỉ phải đúc đặc biệt 0(short)0để có được xung quanh một possible lossy conversion from int to shortlỗi, mặc dù 0 là một đoạn ngắn.
ryvantage

34

Không có cái gọi là byte hoặc chữ ngắn. Bạn cần chuyển sang sử dụng ngắn hạn(short)100


9

Nói chung, bạn chỉ có thể ép kiểu biến trở thành a short.

Bạn cũng có thể gặp những vấn đề như thế này có thể gây nhầm lẫn. Điều này là do +nhà điều hành quảng cáo họ đến mộtint

nhập mô tả hình ảnh ở đây

Truyền các phần tử sẽ không giúp được gì:

nhập mô tả hình ảnh ở đây

Bạn cần truyền biểu thức:

nhập mô tả hình ảnh ở đây


1
Đừng quên có lý do tại sao short + short = int. Nếu tổng của hai điểm ngắn hơn giá trị ngắn tối đa của máy, việc chuyển nó thành ngắn sẽ tạo ra kết quả không mong muốn hoặc tạo ra một ngoại lệ, nếu được languaje hỗ trợ.
DGoiko

2
Với logic đó, việc thêm hai int sẽ trả về rất lâu;)
matt ghi vào

1
Và tôi tìm kiếm điều đó nếu tổng của tôi có thể vượt qua Integer.MAX_VALUE. Tôi không bảo vệ quyết định trả về int (có thể được liên kết với cách HW thực sự thực hiện các tổng), tôi chỉ nói rằng mọi người nên xác nhận rằng kết quả thực sự điền vào một thời gian ngắn trước khi đưa nó vào đó. Tôi đã gặp phải nhiều lỗi giới hạn dung lượng ngắn hơn là giới hạn int cũng như vậy, có thể là do kích thước của các con số liên quan. 2 máy dự trữ java nhỏ byte để tăng giới hạn ngắn rất nhanh
DGoiko

1
Tôi đã đọc lại bình luận của mình và tôi không nói rõ quan điểm của mình. Câu đầu tiên là khó hiểu và tôi nên đã không nói điều đó và chỉ để lại phần còn lại, có vẻ như có hai liên quan statements.The lý do đằng sau ngắn + ngắn phúc int có thể được đọc ở đây: docs.oracle.com/javase/specs/ jvms / se8 / html /… , không có phép tính tổng nào viết tắt trong JVM. Int của Java là 32 bit và khi điều này quyết định nơi tạo ra, hầu hết các máy tính đều là 32 bit, vì vậy tôi đoán là int trông giống như ý tưởng nhất.
DGoiko

1
Cũng lưu ý rằng, như đã giải thích ở đây stackoverflow.com/a/27123302/9465588 , JVM đã thực sự dịch chuyển ít nhất 32 bit của không gian bộ nhớ ảo cho mỗi trường lớp, vì vậy việc khai báo các trường ngắn hoàn toàn không tiết kiệm bộ nhớ. Tôi không biết liệu Java có thay đổi điều này hay không. Tôi có xu hướng không bao giờ sử dụng các giá trị ngắn trừ khi đó là một hạn chế bên ngoài liên quan, như trong DAO
DGoiko

8

Bạn có thể sử dụng setTableId((short)100). Tôi nghĩ rằng điều này đã được thay đổi trong Java 5 để các ký tự số được gán cho byte hoặc ngắn và trong phạm vi cho mục tiêu được tự động giả định là loại đích. Mặc dù vậy, các JVM J2ME mới nhất đó có nguồn gốc từ Java 4.


Tái bút: Chào mừng bạn đến với nỗi đau của thời trung cổ khi viết mã cho J2ME. Không thể chờ đợi các thiết bị cầm tay bắt kịp máy tính để bàn năm 2000.
Lawrence Dol,

3
Không có "J4" (và không có "J5" Xin đừng làm cho Java versioning / đồ đặt tên nữa bối rối hơn nó đã là..
Joachim Sauer

2
@Joachim: Java 1, Java 2, Java 5, Java 6 và Java 7 nổi tiếng và được giới thiệu nhiều như vậy; không quá khó để ngoại suy ý nghĩa của Java 3 và Java 4. "Jn" chỉ đơn giản là viết tắt của điều hiển nhiên. Việc áp dụng danh pháp hiện tại (và hy vọng là cuối cùng) của Sun cho tất cả các phiên bản để giảm sự nhầm lẫn.
Lawrence Dol,

2
@Joachim: Theo từ cuối cùng của Sun về chủ đề này, "1." của Java "1.x" phải được coi như chưa từng có khi đề cập đến các phiên bản đang thảo luận và đang được giữ lại trong phiên bản do JVM tạo ra chỉ để tương thích. Do đó, Java 2 là phiên bản trước đây được gọi là 1.2, từ nơi J2SE ban đầu xuất hiện (bạn sẽ lưu ý rằng cùng lúc Sun khuyến nghị không sử dụng J2xE nữa mà thay vào đó là JavaEE, JavaSE và JavaME). Tiếp theo là 1.3 là Java 3, 1.4 là Java 4, 1.5 là Java 5, 1.6 là Java 6 và 1.7 là Java 7. Nghiêm túc mà nói, điều này không khó để giải thích.
Lawrence Dol,

2
"1." được chỉ cắt của trong Java 5 và sau đó. Java 1.0-1.4 luôn được Sun gọi bằng cái tên đó. Và điều đó được thực hiện một cách có chủ đích, bởi vì Sun đã sử dụng "Java 2" để chỉ Java 1.2 cho đến Java 1.5 / Java 5. Rất khó hiểu, nhưng việc phát minh ra những cái tên mới mà Sun chưa bao giờ sử dụng không hề dễ dàng hơn.
Joachim Sauer
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.