2013-08-31 37 views
16
class A { 

    public static void main(String...args) { 
     Integer var = 10; 

     if(var instanceof Character) // Line1 
      System.out.println("var is a Character"); 
    } 
} 

Tôi biết Dòng 1 sẽ không biên dịch vì trình biên dịch đã phát hiện rằng var không phải là Character.instanceof trong Java - tại sao nó không biên dịch?

Điều tôi không hiểu là lý do trình biên dịch gửi lỗi thay vì trả lại false hoặc true.

Nếu trình biên dịch trả false hoặc true (nghĩa là đối xử với các hoạt động instanceof giống như một thường xuyên xác nhận nếu dựa trên), sau đó nó được nhiều hơn nữa hữu ích .. sẽ nó không?

Hoặc tôi có thiếu điều gì đó hiển nhiên không?

+3

Thay đổi 'Integer var = 10;' to 'Object var = 10;'. Trình biên dịch cho bạn biết rằng 'var' có thể ** không bao giờ ** là' instanceof Character' nếu bạn khai báo nó là một 'Integer'. –

+5

Tại sao điều này lại được giảm giá? Đó là một câu hỏi khá hợp lý. –

+0

@RohitJain Suy nghĩ của tôi chính xác. –

Trả lời

18

Đó là một lỗi biên dịch theo JLS §15.20.2:

Nếu một dàn diễn viên của RelationalExpression đến ReferenceType sẽ bị từ chối là một lỗi thời gian biên dịch, thì biểu thức quan hệ instanceof tương tự sản xuất một lỗi biên dịch thời gian. Trong tình huống như vậy, kết quả của biểu thức instanceof không bao giờ có thể đúng.

RelationalExpression là toán hạng đầu tiên của instanceofReferenceType là lần thứ hai.

3

Ngoài câu trả lời của arshajii nếu bạn muốn tránh lỗi thời gian biên dịch và muốn thời gian chạy kết quả đúng/sai cho kiểm tra xem var là thể hiện của nhân vật sau đó sử dụng mã như thế này:

if(var.getClass().isAssignableFrom(Character.class)) 
    System.out.println("var is a Character"); 
else 
    System.out.println("var is NOT a Character"); 

Như bạn mong đợi nó sẽ in:

var is NOT a Character 
+3

Tôi nghĩ điểm cơ bản của JLS là việc kiểm tra này có thể ** không bao giờ ** trả về 'true' nếu bạn biết rằng loại đó không thể gán được. Điều này là hoàn toàn vô nghĩa - nếu bạn biết đó là một 'Integer' thì kiểm tra này là thừa,' return false' cũng sẽ hoạt động. Nếu bạn không biết rằng 'var' là một' Integer', tức là bạn có một 'Object', thì' instanceof' sẽ biên dịch tốt. –

+1

nó hữu ích, nếu tôi muốn làm ít mã trong một số trường hợp.Tôi có dự án crosswalk trong chế độ chia sẻ ở giai đoạn phát triển và một chế độ nhúng cho sản xuất, tôi sử dụng 'if (this instanceof XWalkActivity)' để kiểm tra, nhưng nó biên dịch lỗi. 'https: // crosswalk-project.org/documentation/shared_mode.html' –

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