2009-03-10 29 views
12

Có điều gì phức tạp tôi nên biết về instanceof? Tôi đang đi qua một danh sách các đối tượng thông qua một vài phương pháp và kiểm tra xem các đối tượng này có thực hiện một giao diện cụ thể hay không bằng cách sử dụng instanceof. Trong một số trường hợp, instanceof xác định chính xác các đối tượng như triển khai giao diện, trong các trường hợp khác thì không. Dường như cho tôi kết quả không phù hợp trên cùng một đối tượng ở những nơi khác nhau. Có bất kỳ thủ thuật/gotcha tôi cần phải nhận thức được ở đây?instanceof mang lại kết quả không phù hợp để phát hiện giao diện?

Trong dự đoán của ý kiến ​​bạn có thể có:

1) Tôi biết instanceof là hình thức xấu. Tôi đang làm việc với một hệ thống phân cấp đối tượng ít hoàn hảo hơn và không thể thay đổi được, và đây là điều tồi tệ nhất mà tôi có thể nghĩ đến.

2) Tôi đang làm việc để tạo một ví dụ mã, nhưng tôi sẽ cần phải đơn giản hóa mã của mình rất nhiều nếu tôi sẽ dán vào bất kỳ thứ gì hữu ích ở đây. Trong khi chờ đợi, nếu bạn đã thấy điều này trước đây và có thể làm sáng tỏ một chút, hãy làm.

+0

Bất kỳ cơ hội lấy mẫu mã nào? – Rontologist

+0

Chỉ cần đoán, nhưng nó khá có thể đơn giản hóa mã của bạn để gửi một mẫu có thể phơi bày vấn đề. instanceof là một toán tử, vì vậy nó luôn hoạt động giống nhau. –

+0

Vâng, tôi đoán là nếu tôi đơn giản hóa mã của tôi đủ để dán vào cho tất cả các bạn hữu ích, tôi sẽ tìm lỗi và không cần phải :) – morgancodes

Trả lời

4

Bí quyết duy nhất tôi biết là nullinstanceof không có loại nào.

+0

+1 vỏ cạnh mát mẻ! – HDave

+0

Tôi đã có một khoảnh khắc đáng kinh ngạc trong việc thực hiện ở đây. –

13

Bạn có đang tải bất kỳ loại động nào, có khả năng từ các trình nạp lớp khác nhau không? Thời gian duy nhất tôi thấy kết quả dường như không phù hợp là khi tôi có hai dòng mã mà xem giống như chúng tham chiếu cùng loại, nhưng thực tế đã tải loại đó từ các trình nạp lớp khác nhau.

+0

Gosh, tôi không _think_ như vậy. Sự kỳ lạ xuất hiện khi chạy một trường hợp kiểm tra junit đơn giản. Điều này mang lại cho tôi đủ thông tin để giả định rằng tôi đã làm điều gì đó câm và chỉ cần đơn giản hóa. Cảm ơn. – morgancodes

-1

Bạn có thể muốn "isAssignable" thay vì instanceof:

if (MyInterface.isAssignableFrom(myObject.getClass())) { 
    // do work here 
} 

này sẽ trở thành sự thật cho các lớp học mà thực hiện giao diện của bạn.

+0

Ví dụ như vậy. –

+0

Chính xác giống như instanceof, nhưng ném NPE nếu myObject là null. – cadrian

+0

... tốt hơn để sử dụng MyInterface.class.isInstance (myObject) - điều này không ném NPE. Ngay cả điều này là vô nghĩa nếu bạn biết MyInterface lúc biên dịch thời gian - cũng có thể sử dụng instanceof –

9

instanceof luôn trả về false cho null. Nó không biên dịch nếu nó không thể cho kiểu tĩnh ở bên trái không thể là một thể hiện của kiểu được chỉ định. Khác hơn thế, nó sẽ làm việc mà không ngạc nhiên.

Không giống như C++ (và tôi tin Smalltalk), một đối tượng không thể thay đổi loại khi chạy. Trong C++, kiểu thay đổi trong quá trình xây dựng, do đó các phương thức không thể được gọi từ một hàm khởi tạo đến các phương thức lớp con [lớp con] có nguồn gốc.

3

Miễn là bạn không gặp sự cố tải lớp, instanceof hoạt động nhất quán. Tôi đoán bạn biết Một instanceof B trả về true nếu A được kế thừa từ B, hoặc một số giao diện A thực hiện hoặc các lớp A mở rộng, là instanceof B.

Nếu bạn nhận được sai khi bạn mong đợi đúng, có thể bạn cố gắng so sánh các trường hợp bắt nguồn từ các Trình nạp lớp khác nhau.

9

Ok, đã giải quyết được sự cố. Như thường lệ, vấn đề là ít kinh khủng hơn tôi tưởng. Dự án tôi đang làm là trong tình trạng không may khi có một số tên lớp trùng lặp. Tôi đã tạo ra các lớp bằng cách sử dụng foo.MyInterface và thử nghiệm ví dụ của bar.MyInterface. Cảm ơn bạn đã trả lời. Nó thực sự đã giúp tôi nghĩ về nó.

+3

Trớ trêu thay, tôi gần như bao gồm khả năng này trong câu trả lời của tôi, nhưng đối với một số lý do không cuối cùng. Điều đó sẽ dạy cho tôi - lần sau tôi sẽ đăng tất cả các ý tưởng, không có vấn đề như thế nào ngớ ngẩn :) –

+0

Cảm ơn bạn đã trả lời câu hỏi của riêng bạn, cũng là sai lầm ngớ ngẩn của tôi! –

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