2012-01-01 83 views
38

thể trùng lặp:
Java isInstance vs instanceOf operatorKhi nào nên sử dụng Class.isInstance() và khi nào thì sử dụng toán tử instanceof?

Khi sử dụng Class.isInstance() và khi nào sử dụng instanceof điều hành?

Java đang cung cấp hai tùy chọn để kiểm tra tính tương thích của bài tập. Sử dụng khi nào?

+5

Nếu bạn định đóng câu hỏi dưới dạng trùng lặp, ít nhất hãy trích dẫn câu hỏi trước đó. – user949300

Trả lời

45

Tôi nghĩ rằng chính thức documentation mang đến cho bạn câu trả lời cho cái này (mặc dù theo một cách khá đặc hiệu):

Phương pháp này là tương đương với năng động của ngôn ngữ Java instanceof điều hành.

Tôi lấy điều đó có nghĩa là isInstance() chủ yếu được dùng để sử dụng trong mã giao dịch với kiểu phản chiếu lúc chạy. Đặc biệt, tôi sẽ nói rằng nó tồn tại để xử lý các trường hợp mà bạn có thể không biết trước các loại (s) của lớp học mà bạn muốn kiểm tra thành viên trước (hiếm khi những trường hợp có lẽ là).

Ví dụ, bạn có thể sử dụng nó để viết một phương pháp để kiểm tra để xem nếu hai đối tượng tùy tiện đánh máy là nhiệm vụ tương thích, như:

public boolean areObjectsAssignable(Object left, Object right) { 
    return left.getClass().isInstance(right); 
} 

Nói chung, tôi muốn nói rằng việc sử dụng instanceof nên ưa thích bất cứ khi nào bạn biết loại lớp bạn muốn kiểm tra trước. Trong những trường hợp rất hiếm khi bạn không sử dụng, thay vào đó hãy sử dụng isInstance().

+6

Một trường hợp sử dụng điển hình khác cho phương thức 'isInstance' là khi xử lý các generic. Có rất nhiều tình huống mà bạn có đối tượng 'Class ', và cách duy nhất để kiểm tra xem một đối tượng thuộc về lớp đó là phương thức 'isInstance' – Robin

48

Đối với instanceof bạn cần biết lớp chính xác tại thời gian biên dịch.

if (foo instanceof ThisClassIKnowRightNow) 
    ... 

Đối với isInstance lớp học được quyết định vào thời gian chạy. (ràng buộc trễ), ví dụ:

if (someObject.getClass().isInstance(foo)) 
    ... 
+9

+1: Tới điểm. Cũng với các luồng Java 8, '.filter (ThisClassIKnowRightNow.class :: isInstance)' hơi ngắn gọn hơn '.filter (o -> o instanceof ThisClassIKnowRightNow)'. – antak

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