Trình biên dịch Java phải chọn giữa hai phương thức khớp. Nó sẽ luôn luôn chọn một phương thức không sử dụng biến số (varargs) trên một phương thức không sử dụng nó. Nó sẽ thúc đẩy tất cả 3 đối số đến int
để khớp với số printValue
đầu tiên so với varargs sử dụng.
Section 15.12.2 of the JLS trạng thái:
Phần còn lại của quá trình này được chia thành ba giai đoạn, để đảm bảo khả năng tương thích với các phiên bản của ngôn ngữ lập trình Java trước khi Java SE 5.0. Các giai đoạn là:
- Giai đoạn đầu (§15.12.2.2) thực hiện Nghị quyết tình trạng quá tải mà không cho phép đấm bốc hoặc chuyển đổi unboxing, hay việc sử dụng các biến arity phương pháp gọi. Nếu không có phương pháp áp dụng được tìm thấy trong giai đoạn này thì việc xử lý tiếp tục đến giai đoạn thứ hai.
Điều này đảm bảo rằng bất kỳ cuộc gọi đó là hợp lệ trong ngôn ngữ lập trình Java trước JDK 5.0 không được coi là mơ hồ như là kết quả của sự ra đời của phương pháp arity biến, boxing ngầm và/hoặc unboxing. Tuy nhiên, việc khai báo một phương thức arity biến (§8.4.1) có thể thay đổi phương thức được chọn cho một biểu thức phương thức phương thức đã cho, bởi vì một phương thức arity biến được coi là một phương thức arity cố định trong giai đoạn đầu tiên. Ví dụ, khai báo m (Object ...) trong một lớp đã khai báo m (Object) làm cho m (Object) không còn được chọn cho một số biểu thức gọi (như m (null)), như m (Object []) cụ thể hơn.
- Giai đoạn thứ hai (§15.12.2.3) thực hiện độ phân giải quá tải trong khi cho phép boxing và unboxing, nhưng vẫn loại trừ việc sử dụng phương thức invity biến. Nếu không có phương pháp áp dụng được tìm thấy trong giai đoạn này thì việc xử lý tiếp tục đến giai đoạn thứ ba.
Điều này đảm bảo rằng phương thức sẽ không bao giờ được chọn thông qua lời gọi phương thức xác thực biến thiên nếu nó được áp dụng thông qua lời gọi phương thức xác thực.
- Giai đoạn thứ ba (§15.12.2.4) cho phép quá tải được kết hợp với các phương pháp xác định biến số, quyền anh và unboxing.
(tôi nhấn mạnh đậm)
Một phương thức khớp (sự quá tải đầu tiên) được tìm thấy trong giai đoạn đầu, vì vậy trình biên dịch thậm chí không xem xét các giai đoạn thứ ba - cho phép phương pháp arity biến - - vì vậy int
được in.
Một cách để chọn quá tải thứ hai (mà in ngược theo cách long
) là tạo một mảng một cách rõ ràng để quá tải đầu tiên không thể khớp.
printValue(new byte[]{b,b,b});