2015-11-23 18 views
7

Tôi có đoạn code sau trong Java:Tại sao việc gán một biến ngắn vào tham chiếu Integer tạo ra một lỗi thời gian biên dịch?

class Boxing 
    { 
     public static void main(String args[]) 
     { 
      short s = 10; 
      Integer iRef = s; 
     } 
    } 

Tại sao nó tạo ra một lỗi trong lập? Nếu tôi định kiểu ngắn gọn một số nguyên trong biểu thức, nó biên dịch thành công. Vì tôi đang sử dụng một từ ngắn trong một biểu thức không phải là loại của nó được cho là một số nguyên theo mặc định mà không yêu cầu trường hợp rõ ràng?

+0

tôi sẽ làm 'int iRef = s'. –

+4

Đó không phải là câu hỏi của tôi. Câu hỏi của tôi là tại sao Integer iRef = s không hoạt động. –

Trả lời

12

Bạn muốn có hai điều xảy ra ở đây: mở rộng và tự động đấm bốc.

Thật không may, Java chỉ thực hiện một trong hai cách tự động. Lý do cho điều đó rất có thể là autoboxing đã được giới thiệu khá muộn (trong Java5), và họ phải cẩn thận để không phá vỡ mã hiện có.

Bạn có thể làm

int is = s; // widening 

Short sRef = s; // autoboxing 

Integer iRef = (int) s; // explicit widening, then autoboxing 
1

Chuyển đổi quyền anh chuyển đổi các biểu thức của kiểu nguyên thủy thành biểu thức tương ứng của loại tham chiếu. Cụ thể, chín chuyển đổi sau đây được gọi là chuyển đổi boxing:

Từ kiểu boolean để gõ Boolean

Từ kiểu byte để gõ Byte

Từ loại ngắn để gõ ngắn

Từ loại char để nhập Ký tự

Từ loại int thành loại Integer

Từ loại dài để gõ dài

Từ kiểu float gõ nổi

Từ kiểu double gõ đúp

Từ kiểu null để loại rỗng

tham khảo: Conversions and Promotions Reference

1

Here's tài liệu từ JLS 5.1.7

Boxing chuyển đổi chuyển đổi biểu thức kiểu nguyên thủy để biểu của kiểu tham chiếu tương ứng.Cụ thể, chín chuyển đổi sau đây được gọi là chuyển đổi boxing:

Từ kiểu boolean để gõ Boolean

Từ kiểu byte để gõ Byte

Từ loại ngắn để gõ ngắn

Từ kiểu char để loại Ký tự

Từ loại int thành loại Integer

Từ loại long to type Long

Từ kiểu float gõ nổi

Từ kiểu double gõ đúp

Từ kiểu null để loại rỗng

Về cơ bản việc chuyển đổi trực tiếp short-Integer không phải là một phần của quá trình tự động hóa của Java.

Các autoboxing, theo quy định ở trên, chỉ có thể implicity đúc kiểu nguyên thủy chiếm đến Nó rất đại diện cho lớp Wrapper. Vì đây không phải là trường hợp nó sẽ gây ra một lỗi thời gian biên dịch.

0

Trong đoạn code xem xét.

class Boxing 
{ 
    public static void main(String args[]) 
    { 
     short s = 10; 
     Integer iRef = s; 
    } 
} 

Số nguyên mở rộng java.lang.Number. Và java.lang.Short cũng mở rộng java.lang.Number. Nhưng Ngắn và Số nguyên không liên quan trực tiếp nếu bạn muốn bạn có thể chạy chương trình sau.

class Boxing 
{ 
    public static void main(String args[]) 
    { 
     short s = 10; 
     Number iRef = s; 
    } 
} 

Nó sẽ chạy mà không tạo ra lỗi nào.

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