2013-01-20 32 views
10

Chỉ cần cố gắng tìm hiểu auto-boxing, mà tôi làm ngoài một điều:lớp Wrapper - tại sao literals số nguyên không cho Long nhưng làm việc cho bất cứ điều gì nhỏ

Short s = 250; 
Long l = 250; 

Việc chuyển nhượng để Long l thất bại. Điều này, tôi mong đợi, là vì bạn không thể mở rộng hộp sau đó (nghĩa là bạn không thể mở rộng giá trị int250 thành long và sau đó hộp nó không thể thực hiện).

Tuy nhiên, việc gán cho Short s hoạt động. Điều gì đang xảy ra để làm cho tiền phạt này? Giả định của tôi là nó vẫn còn làm boxing và một số loại chuyển đổi. Nhưng nếu nó là một trường hợp của nó biết 250 phù hợp với một short, tại sao nó không biết rằng 250 sẽ phù hợp với một long?

+1

Tự động đấm bốc là điều ác [Chỉ cần một ý kiến]. Trong các dự án tư nhân của tôi và tại công ty tôi làm việc tại chúng tôi xử lý auto-boxing là lỗi để tránh bất kỳ sự nhầm lẫn nào. – MrSmith42

+1

làm thế nào để nó 'thất bại cho Long'? – Archer

+0

Trong sự tò mò, điều gì sẽ xảy ra với Ngắn khi chữ của bạn là 250L? (Offhand tôi biết rằng chỉ định một long literal, nhưng tôi không chắc chắn nếu có một tương ứng rõ ràng ngắn literal) – Charlie

Trả lời

11

Thông thường, bạn không thể áp dụng nhiều chuyển đổi (ngầm) trong chuyển nhượng (JLS §5.2 Assignment Conversion):

Phân chuyển đổi xảy ra khi giá trị của một biểu thức được gán (§15.26) cho một biến: loại của biểu thức phải được chuyển đổi thành loại biến. bối cảnh chuyển nhượng cho phép sử dụng một trong những sau:

  • một chuyển đổi danh tính (§5.1.1)
  • chuyển đổi nguyên thủy mở rộng (§5.1.2)
  • chuyển đổi tài liệu tham khảo mở rộng (§ 5.1.5)
  • chuyển đổi quyền anh (§5.1.7) theo sau tùy chọn chuyển đổi tham chiếu mở rộng
  • chuyển đổi unboxing (§5.1.8) theo sau tùy chọn mở rộng chuyển đổi nguyên thủy.

Long l=250; đòi hỏi hai chuyển đổi (mở rộng chuyển đổi nguyên thủy sau đó chuyển đổi quyền Anh), đó là lý do tại sao nó không biên dịch.

Long l=250l; biên dịch vì nó đòi hỏi một chuyển đổi quyền anh.

Nhưng thu hẹp chuyển đổi của một biểu thức hằng là một trường hợp đặc biệt, đó là lý do tại sao Short s=250; biên dịch:

Bên cạnh đó, nếu biểu thức là một biểu thức hằng số (§15.28) kiểu byte, short, char hoặc int :

  • Chuyển đổi nguyên thủy thu hẹp có thể được sử dụng nếu loại biến là byte, ngắn hoặc char và giá trị của biểu thức không đổi được thể hiện trong loại biến.
  • Một thu hẹp chuyển đổi nguyên thủy theo sau là một chuyển đổi quyền anh có thể được sử dụng nếu kiểu của biến là:
    • Byte và giá trị của biểu thức liên tục được biểu diễn trong các loại byte.
    • Ngắn và giá trị của biểu thức hằng số là biểu thị trong loại ngắn.
    • Ký tự và giá trị của biểu thức hằng số là biểu thị trong loại char.
+0

Cảm ơn những nỗ lực bạn phải có trong việc tạo ra câu trả lời này, nó được đánh giá cao. Vậy đó là "trường hợp đặc biệt"? Tôi đã hy vọng có một lý do hữu hình mà tôi không hiểu và do đó có thể học hỏi hơn là một cái gì đó tôi phải nhớ một cách rõ ràng như một ngoại lệ cho loại quy tắc của sự vật. –

+0

@ user1186046: Tôi không thể tưởng tượng lý do rõ ràng cho trường hợp cụ thể này, nhưng có lẽ tôi có thể làm rõ hơn như sau: toàn bộ khái niệm thu hẹp chuyển đổi biểu thức không đổi là trường hợp đặc biệt (vì đó là loại chuyển đổi thu hẹp duy nhất có thể xảy ra ngầm), do đó không có gì ngạc nhiên khi nó mang lại các trường hợp đặc biệt khi áp dụng cho các phần cụ thể của ngôn ngữ. – axtavt

+0

Xin chào, lý do cho trường hợp là tôi đang làm OCJP và điểm của bài kiểm tra không phải là để kiểm tra kiến ​​thức java của bạn nhưng để kiểm tra những thứ không liên quan bạn không cần biết để bạn có thể mua sách của người giám định ;) –

0

Lý tưởng nhất, không thu hẹp tự động nên được cho phép.

Nhưng vì không có byte/literals ngắn, chúng ta không thể viết

byte b = 0b; 

và nó có vẻ ngớ ngẩn để

byte b = (byte)0; 

để tự động thu hẹp hằng số nguyên được phép vì vậy chúng tôi có thể viết

byte b = 0; 

được chuyển sang hộp tự động.

Lâu/dài, vì có các số liệu dài, điều này ít gây ra vấn đề. Tuy nhiên, nó nên được cho phép, vì tự động mở rộng của số nguyên đã ký luôn luôn an toàn.

Các vấn đề liên quan