2017-09-04 14 views
7

Hãy xem xét hai tập hợp phương pháp sau đây. Cái đầu tiên được chấp nhận, cái thứ hai bị loại bỏ là mơ hồ. Sự khác biệt duy nhất là giữa việc sử dụng int và Integer.Phương pháp varargs mơ hồ với Object và kiểu nguyên thủy

Có nhu cầu cụ thể nào để từ chối thẻ thứ hai không? Điều đó có nghĩa là chấp nhận nó sau khi boxing (mà sẽ dẫn đến tập đầu tiên) có một vấn đề. Tôi nhớ gì ở đây?

Từ quan điểm của tôi, trình biên dịch Java quá hạn chế ở đây.

Set 1:

public void test(Object... values) {} 

public void test(Integer x, Object... values) {} // difference here 

public void b() { 
    test(1, "y"); // accepted 
} 

Set 2:

public void test(Object... values) {} 

public void test(int x, Object... values) {} // difference here 

public void b() { 
    test(1, "y"); // marked as ambiguous 
} 

Set 2 tạo ra lỗi biên dịch:

error: reference to test is ambiguous 
    test(1, "y"); // marked as ambiguous 
    ^
    both method test(Object...) in T and method test(int,Object...) in T match 

Java 1.8, Eclipse Oxygen

+0

Các methos từ Set 1 và Set 2 nằm trong cùng một lớp? –

+1

@RafaelVieiraCoelho Tất nhiên là không. – Kayaman

+0

cùng một lớp. Tôi chỉ chỉnh sửa lớp để thay đổi giữa hai lớp. –

Trả lời

1

Sự khác biệt là trong trường hợp đầu tiên, t đối số 1 cần phải được đóng hộp thành Số nguyên và sau đó chọn phương thức phù hợp nhất; đó là phiên bản (Integer, Object...).

Trong trường hợp thứ hai, có hai lựa chọn - quyền anh hay không. Đây là những gì làm cho nó mơ hồ.

Tôi đồng ý rằng điều này phản trực giác.

+0

Tôi đồng ý, trình biên dịch thực hiện chính xác đặc điểm kỹ thuật. Quan điểm của tôi là trình biên dịch Java có thể dễ dàng dỡ bỏ hạn chế này tại thời gian biên dịch: không cần phân tích phức tạp. Đặc điểm kỹ thuật quá hạn chế –

5

Trình biên dịch đang thực hiện các quy tắc được nêu trong JLS 15.12.2.5 để chọn phương pháp cụ thể nhất trong các trường hợp có nhiều phương pháp có thể áp dụng cho lời gọi. Trong các ví dụ trong câu hỏi của bạn, sự khác biệt được bao phủ bởi dòng này trong spec:

A type S is more specific than a type T for any expression if S <: T (§4.10).

nơi S <: T nghĩa là S là một subtype của T.

Trong ví dụ # 1:

  • Có hai phương pháp được áp dụng
  • Loại Integer là một subtype của Object, vì vậy nó là cụ thể hơn.
  • Do đó, phương pháp thứ hai cụ thể hơn phương pháp thứ nhất.
  • Do đó, phương pháp thứ hai được chọn.

Trong ví dụ # 2:

  • Có hai phương pháp được áp dụng
  • Loại int không phải là một subtype của Object hoặc ngược lại, vì vậy không loại là cụ thể hơn khác.
  • Do đó, cả hai phương pháp đều không cụ thể hơn phương pháp kia.
  • Do đó yêu cầu không rõ ràng.
0

Để đóng vấn đề này, hãy để tôi tóm tắt các câu trả lời thực tế cho câu hỏi của tôi khi tôi hiểu chúng: hành vi là chính xác theo đặc điểm kỹ thuật. Các đặc điểm kỹ thuật có thể được thư giãn như vậy mà các loại nguyên thủy được bao phủ như là đối tác nguyên thủy của họ. Một lý do chưa được thực hiện là sự phức tạp của việc chỉ định và thực hiện một trình phân tích cú pháp nhanh và chính xác.

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