2010-08-30 45 views
12

Tôi hơi bối rối: Tôi có một hàm, lấy đối tượng làm đối số. Nhưng trình biên dịch không phàn nàn nếu tôi chỉ vượt qua một nguyên thủy và thậm chí nhận ra một nguyên thủy boolean như Boolean Object. Tại sao vậy?java: boolean instanceOf Boolean?

public String test(Object value) 
{ 
    if (! (value instanceof Boolean)) return "invalid"; 
    if (((Boolean) value).booleanValue() == true) return "yes"; 
    if (((Boolean) value).booleanValue() == false) return "no"; 
    return "dunno"; 
} 

String result = test(true); // will result in "yes" 
+2

Lưu ý rằng boolean KHÔNG BAO GIỜ là một cá thể của Boolean. Bạn không bao giờ có thể vượt qua một nguyên thủy cho toán tử instanceof. Boolean nguyên thủy của bạn không bao giờ bước vào phương pháp này, boxing đã xảy ra khi các invocation đã xảy ra và phương pháp invocation chuyển đổi xảy ra! – Mishax

Trả lời

29

Bởi vì nguyên thủy 'true' sẽ Autoboxed-Boolean và đó là một Object.

+3

(+1) Và đây là một số [tài liệu đi kèm với nó] (http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html) –

+0

Đọc thêm: http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html @jpegzz, mã sẽ không biên dịch nếu bạn chạy với 1.4.x –

+0

thú vị :) Vâng, các tài liệu chỉ đề xuất sử dụng autoboxing nếu thực sự cần thiết vì vậy tôi sẽ không. Nhưng nó là tốt đẹp để biết rằng đây không phải là một lỗi nhưng một tính năng :) – epegzz

2

này một phần của phương pháp này:

if (((Boolean) value).booleanValue() == true) return "yes"; 
    if (((Boolean) value).booleanValue() == false) return "no"; 
    return "dunno"; 

thể được thay thế bằng

if (value == null) return "dunno"; 
    return value ? "yes" : "no"; 
+0

không giống như hành vi mã của OP. 'null' sẽ trả về" không hợp lệ "vì' null' không phải là một thể hiện của 'Boolean' (bạn đang thiếu dòng đó từ mã OP trong mã đầu tiên của bạn ở trên); "dunno" sẽ không bao giờ được trả lại (bằng mã ban đầu). Không có dòng đó, mã đầu tiên của bạn sẽ ném một NPE khi giá trị là 'null'. –

+0

@Carlos, tôi không bao giờ có thể nhớ nếu 'instanceof' trả về true hoặc false với tất cả các null, vì vậy tôi thường tránh trường hợp bằng cách kiểm tra null trước. –

3

Giống như câu trả lời trước nói: nó được gọi là autoboxing.

Thực tế, tại thời gian biên dịch, javac sẽ chuyển giá trị primitve boolean thành đối tượng Boolean. Chú ý rằng thông thường, đảo ngược chuyển đổi có thể tạo ra NullPointerException rất lạ do, làm ví dụ, để đoạn mã sau:

boolean b = null; 
if(b==true) <<< Exception here ! 

Bạn có thể có một cái nhìn tại JDK documentation để biết thêm infos.

+7

Ý của bạn là 'Boolean b = null; '?? – mlvljr

+1

Tôi nghĩ bạn có nghĩa là 'Boolean b = null;' thay vì 'boolean b = null;'. Lưu ý vốn. –