2016-03-31 53 views
19

Tôi đang sử dụng mã:Tại sao `System.out.println (null);` cho "Phương thức println (char []) không rõ ràng đối với loại lỗi PrintStream"?

System.out.println(null); 

Nó được hiển thị lỗi:

The method println(char[]) is ambiguous for the type PrintStream 

Tại sao không null đại diện Object?

+2

'System.out.println ((đối tượng) null); ' –

+1

Có thể trùng lặp của [không thể vượt qua null để thực thi(); phương pháp của AsyncTask trong android 4.0] (http://stackoverflow.com/questions/10679739/unable-to-pass-null-to-execute-method-of-asynctask-in-android-4-0) – Raedwald

+1

Xem thêm http : //stackoverflow.com/questions/13033037/how-is-an-overloaded-method-chosen-when-a-parameter-is-the-literal-null-value – Raedwald

Trả lời

25

Có 3 println phương thức trong PrintStream chấp nhận loại tham chiếu - println(char x[]), println(String x), println(Object x).

Khi bạn vượt qua null, tất cả 3 đều có thể áp dụng. Các quy tắc nạp chồng phương thức thích phương thức với các loại đối số cụ thể nhất, do đó, println(Object x) không được chọn.

Sau đó trình biên dịch không thể lựa chọn giữa đầu tiên hai - println(char x[]) & println(String x) - kể từ String là không cụ thể hơn so char[] và ngược lại.

Nếu bạn muốn chọn phương thức cụ thể, hãy bỏ giá trị rỗng vào loại được yêu cầu.

Ví dụ:

System.out.println((String)null); 
+1

Tôi biết và hiểu khái niệm này. Nhưng vì lợi ích của sự hoàn chỉnh của câu trả lời, liệu JLS có ở đâu đó xác định tại sao, ví dụ, 'char []' và 'String' đều không cụ thể? Sau khi tất cả, 'char' là một nguyên thủy và' String' là một đối tượng. – Magnilex

+11

@ Magnilex char là một nguyên thủy, nhưng char [] là một đối tượng. char [] không phải là một lớp con của String và String không phải là một lớp con của char []. Do đó không một trong hai cụ thể hơn. – Eran

+3

@KannanThangadurai lưu ý rằng bạn có thể viết 'char x []' thành 'char [] x' - nhiều (ví dụ: [Hướng dẫn kiểu của Google] (https: // google.github.io/styleguide/javaguide.html#s4.8.3.2-array-declarations)) thích dạng sau vì kiểu 'x' là' char [] ', không phải' char'. Việc giữ các loại với nhau giúp dễ đọc hơn. –

7

Nếu bạn gọi System.println(null) có nhiều phương pháp ứng cử viên (với char [], StringObject lập luận) và trình biên dịch không thể quyết định cái nào để dùng.

Khắc phục
Thêm một diễn viên rõ ràng vào rỗng.

System.out.println((Object)null); 

Hoặc sử dụng null object pattern.


Why does't null represent Object?

Từ JLS 4.1 The Kinds of Types and Values

There is also a special null type, the type of the expression null, which has no name.
Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type.
The null reference is the only possible value of an expression of null type. The null reference can always be cast to any reference type.
The null reference can always be assigned or cast to any reference type

In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type

Vì vậy, các loại nullkhôngObject, mặc dù nó có thể được chuyển đổi sang (đọc theo sự phân công để) một Object.

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