2015-02-09 20 views
15

Xem xét đoạn mã sau:Loại trình diễn ngầm định không hoạt động đối với các tham số phương pháp?

class TypeCast{ 
    public static void main(String[] args){ 
    byte by = 4;  //compiler casts int literal to byte 

    doCasting(4); //Compilation Error: external type casting is required. WHY ? 

    } 

    public static void doCasting(byte by){ 

    } 

} 

Tôi nghĩ đoạn mã trên khá tự giải thích. Trong khi int gán chữ cho loại byte, trình biên dịch sẽ tự động truyền tự động. Điều tương tự cũng không xảy ra khi chúng ta gọi phương thức tham số byte với int. Tại sao?

+0

Bạn không thể. Một hằng số cơ bản được coi là một số nguyên, vì vậy bạn phải rõ ràng downcast nó thành một byte để chuyển nó thành một tham số. Theo như tôi biết không có lối tắt. [Nguồn] (http://stackoverflow.com/questions/5193883/how-do-you-specify-a-byte-literal-in-java) – Milkmaid

Trả lời

14

Đây là sự khác biệt giữa một bối cảnh phân (JLS 5.2) và một bối cảnh gọi (JLS 5.3) cho chuyển đổi.

chuyển đổi bối cảnh chuyển nhượng bao gồm:

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, int hay:

  • 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 hằng số là biểu thị trong loại biến.

Đó không phải là hiện diện trong chuyển đổi bối cảnh sự thỉnh nguyện.

Nó không rõ ràng với tôi lý do tại sao ngôn ngữ được thiết kế theo cách đó, ngoài việc có thể đơn giản hóa độ phân giải quá tải - nếu bạn có:

doCasting(5); 
... 
doCasting(int x) {} 
doCasting(byte b) {} 

sau đó bạn có thể tranh luận cho một trong hai trong số đó là "phù hợp nhất" - byte là loại cụ thể hơn int, nhưng nếu bạn cho rằng chữ là loại int thì quá tải byte yêu cầu chuyển đổi trong khi quá tải int không.

Bằng cách thực hiện quá tải byte chỉ đơn giản là không áp dụng được, câu hỏi sẽ bị xóa.

+1

Đồng ý với "độ phân giải quá tải". Thay thế: giới thiệu hậu tố loại byte ngoài L. – laune

+0

@laune: Chắc chắn, đó là một lựa chọn tuyệt vời. Tôi đã xem xét những gì đã có mặt hơn là cố gắng để nghĩ về biện pháp khắc phục :) –

+1

Tôi sẽ không gọi đó là "tuyệt vời", những gì với ... B ẩn có nhị phân ngay cả cách trở lại sau đó, hoặc 0x10B. Ngay cả 'L' là một eviL cần thiết. – laune

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