2012-09-27 39 views
6
public void m1(Integer f) { 
    ... 
} 

public void m1(Float f) { 
    ... 
} 

public void main() { 
    m1(null); // error: the method m1(Integer) is ambiguous for the type Main 
    m1((Integer) null); // success 
} 

Với ví dụ trên, chúng ta có thể thừa nhận trong một số cách rằng null được gõ. Vậy tại sao các dòng sau in true? Chắc chắn o1o2 cả hai đều không có giá trị (ví dụ: null), nhưng chúng không phải từ cùng một loại (Integer so với Float). Trước hết tôi nghĩ rằng false sẽ được in.So sánh hai đối tượng null từ hai loại khác nhau

Integer i = null; 
Object o1 = (Object) i; 
Float f = null; 
Object o2 = (Object) f; 
System.out.println(o1 == o2); // prints true 

// in short: 
System.out.println(((Object) ((Integer) null)) == ((Object) ((Float) null))); // prints true 
+0

Null không có một loại: [http : //stackoverflow.com/questions/2707322/what-is-null-in-java] [1] [1]: http://stackoverflow.com/questions/2707322/what-is-null-in -java – Stegrex

+0

'null' được gõ; xem câu trả lời của tôi – irreputable

Trả lời

8

Tất cả các giá trị null không được nhập và bằng nhau. Bạn có thể chuyển nó đến các kiểu tham chiếu khác nhau nhưng nó không tạo sự khác biệt cho các mục đích so sánh.

Đây không phải là giá trị null được nhập nhưng tham chiếu đến giá trị rỗng có thể được nhập.

Một câu hỏi phổ biến là những gì xảy ra ở đây

class A { 
    public static void hello() { System.out.println("Hello World"); } 

    public static void main(String... args) { 
     A a = null; 
     a.hello(); 
     System.out.println("a is an A is " + (a instanceof A)); // prints false. 
    } 
} 

Các biên dịch thấy loại a như một A nên phương pháp tĩnh được gọi. Nhưng giá trị được tham chiếu là null và không được nhập.

Các thao tác duy nhất bạn có thể thực hiện với null mà không gây ra NullPointerException là chỉ định hoặc vượt qua nó mà không kiểm tra hoặc so sánh nó với một tham chiếu khác.

BTW

Nói tóm lại: Trình biên dịch sẽ lựa chọn một phương pháp dựa vào loại tài liệu tham khảo, tại thời gian chạy thực hiện được dựa trên lớp của đối tượng được tham chiếu. Tại thời gian chạy null được coi là bất kỳ loại hoặc không có loại hoặc bạn nhận được một NullPointerException nếu bạn cố gắng dereference nó.

1

"==" trong kiểm tra Java để xem liệu đó có phải là cùng một ví dụ thay vì chỉ đơn giản là "chúng có bằng nhau không?". Không có khái niệm về nhiều thể hiện của null trong Java. Nếu bạn so sánh null với null, bạn sẽ luôn nhận được true bất kể loại nào.

Lý do tại sao bạn không thể chuyển null thành đối số cho một phương thức có cùng tên với một đối số khác với các loại tham số khác nhau là vì phương pháp có thể là ứng viên được gọi mà không có ngữ cảnh loại tiếp theo. Thay vì đoán cái nào có thể, nó chỉ ra một lỗi chính xác.

0

Với ví dụ trên, chúng ta có thể thừa nhận rằng null KHÔNG được nhập: khi bạn gọi m1(null), trình biên dịch không thể xác định loại tham số thực tế và không thể quyết định phương thức nào cần gọi. Tất cả các giá trị null đều bằng nhau và không được nhập và do đó, (null==null)==true.

0

Null không có loại, nhưng tham chiếu (đến null hoặc bất kỳ thứ gì khác) có loại.Chúng ta có thể tuyên bố hai biến tài liệu tham khảo với các loại khác nhau, nhưng null họ đề cập đến là điều tương tự trong cả hai trường hợp:

Integer a = null; 
Double b = null; 

Trong ví dụ của bạn,

m1((Integer) null); 

trình biên dịch sử dụng các loại các tài liệu tham khảo nó được thông qua để làm việc mà phương pháp quá tải để gọi, không phải là loại giá trị null chính nó.

0

Trong ví dụ của bạn, nó chứng minh rằng trình biên dịch không thể nhận dạng loại (của null) và quyết định phương thức cần gọi. Vì vậy, bạn phải explicity cho loại. Ngoài ra null == null sẽ luôn đúng; không có vấn đề gì cast bạn làm nó không thay đổi hoặc cho null một loại.

Điều này post có mô tả dài trên null.

1

thấy http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.1

null thuộc "loại null". "Null type" chỉ có một giá trị - null.

Loại trống là loại phụ của mọi loại tham chiếu. Do đó, chúng tôi có thể làm

Integer i = null; 
(Integer)null 

Trong một từ khác, null là giá trị hợp lệ trong mọi loại tham chiếu.

(Hãy nghĩ về một loại như là một tập hợp các giá trị; các loại của một giá trị là bộ nó thuộc về; "Loại" có nghĩa là "tập hợp con".)

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