2009-06-04 35 views
73

Tôi muốn kiểm tra xem một đối tượng o là một phiên bản của lớp C hoặc của một lớp con của C.Có điều gì giống như instanceOf (Class <?> c) trong Java không?

Ví dụ, nếu p là của lớp Point Tôi muốn x.instanceOf(Point.class)true và cũng x.instanceOf(Object.class)true.

Tôi cũng muốn nó hoạt động đối với các kiểu nguyên thủy được đóng hộp. Ví dụ: nếu xInteger thì x.instanceOf(Integer.class) phải là true.

Có điều gì không? Nếu không, làm thế nào tôi có thể thực hiện một phương pháp như vậy?

+0

xử lý các lớp học đóng hộp là một chút lộn xộn – dfa

Trả lời

141

Class.isInstance thực hiện những gì bạn muốn.

if (Point.class.isInstance(someObj)){ 
    ... 
} 

Tất nhiên, bạn không nên sử dụng nó nếu bạn có thể sử dụng instanceof thay vào đó, nhưng đối với các tình huống phản ánh nó thường đi kèm có ích.

+0

Tại sao chúng ta không nên sử dụng? bất kỳ vấn đề hiệu suất nào? – Ahamed

+6

@ Xấu hổ có thể chậm hơn, nhưng điều tồi tệ hơn là khó hiểu hơn! Nếu có một cách rất đơn giản để làm điều gì đó - như 'if (một instanceof Point)' - nhưng bạn làm theo cách phức tạp hơn, bất cứ ai đọc mã đều nhất định nghĩ "oh, phải có lý do cho việc này được thực hiện một cách khó khăn ", và sau đó chuyển đến các tài liệu để tìm hiểu cách' Class.isInstance' khác với 'instanceof'. Bạn lãng phí thời gian của đồng nghiệp. – gustafc

8
x instanceof Integer 
x instanceof Object 

bạn chỉ cần sử dụng đúng cú pháp

với nhiều loại primitve, bạn phải làm điều đó hoàn toàn khác nhau. Vì bạn không thể tạo các phương thức cho chúng, bạn cần một lớp để giữ phương thức. Vì vậy, thay vì "x.instanceOf (Integer.Class)", bạn phải gọi "MyClassComparer.instanceOf (x, Integer.Class)" hoặc một cái gì đó tương tự. Điều này có thể dễ dàng được thực hiện bởi các phương thức nạp chồng, nhưng tôi không thấy một trường hợp nào khi chức năng đó có thể được mong muốn.

0

Bạn có thể làm:

if (foo instanceof classNameYouWantToCheck) 
+0

bạn không thể sử dụng instanceof với các loại nguyên thủy – dfa

+0

Lớp chỉ chứng tỏ mình nên viết tên lớp ở đó. Tôi sẽ sửa chữa nó – fmsf

4

Trong thực tế trong Java có một nhà điều hành boolean gọi instanceof mà có thể được sử dụng để xác định xem một đối tượng là một thể hiện của một lớp học, một thể hiện của một lớp con, hoặc một ví dụ của một lớp thực hiện một giao diện cụ thể.

if(obj instanceof SomeClass) { 
    // Do something 
} 

Java Tutorial có good example của toán tử này

+1

bạn không thể sử dụng instanceof với các kiểu nguyên thủy – dfa

+4

Ông đã nhầm lẫn các kiểu nguyên thủy với các đối tượng. Vui lòng đọc ... "Ví dụ, nếu x là một số nguyên thì x.instanceOf (Integer.class) và x.instanceOf (Object.class) phải đúng." Xấu hổ về bạn xuống bỏ phiếu tất cả các câu trả lời –

+0

Thứ hai (sp) đề xuất sử dụng Hướng dẫn Java. Nó là một tài liệu tham khảo tốt cho việc học ngôn ngữ chính nó. –

19

tôi muốn kiểm tra xem một đối tượng o là một thể hiện của lớp c hoặc của một lớp con của c. Ví dụ, nếu p là của lớp Point Tôi muốn x.instanceOf (Point.class)

Um ... gì? O, p và x là gì?

Tôi cũng muốn nó hoạt động cho các loại nguyên thủy . Ví dụ: nếu x là một số nguyên thì x.instanceOf (Số nguyên) và x.instanceOf (Object.class) phải là đúng.

No. Nó thậm chí không nên biên dịch. Nguyên thủy không phải là đối tượng, và bạn không thể gọi các phương thức trên chúng.

Dù sao, có ba điều, một trong số đó chắc chắn có thể đạt được những gì bạn muốn (chúng khác nhau một chút ở nơi chính xác được áp dụng:

  • Nhà điều hành instanceof nếu bạn biết lớp tại thời điểm biên dịch.
  • Class.isInstance() nếu bạn muốn kiểm tra lớp của đối tượng đối với một lớp không biết lúc biên dịch.
  • Class.isAssignableFrom() nếu bạn muốn kiểm tra khả năng gán cho hai đối tượng lớp học.
0

"Tôi muốn nó cũng hoạt động cho các kiểu nguyên thủy. Ví dụ, nếu x là một số nguyên thì x.instanceOf (Integer.class) và x.instanceOf (Object.class) phải đúng".

Tại sao? Các kiểu nguyên thủy và kiểu tham chiếu hoàn toàn tách biệt. Một int nguyên thủy không phải là một kiểu con của Integer hay Object. Loại giá trị nguyên thủy luôn được biết là tĩnh tại thời gian biên dịch, vì vậy không có điểm nào trong việc kiểm tra kiểu của nó. Chắc chắn, bạn có thể chọn một giá trị nguyên thủy và sau đó kiểm tra loại của nó:

(Integer)5 instanceof Integer 

Nhưng điều gì sẽ là điểm?

-1

Tôi nghĩ bạn đang nhầm lẫn về instanceof cho các đối tượng thô và những lá thư giống

obj instanceof Class 
obj instanceof Class<?> // this is the one you want 
+1

Bạn không thể sử dụng generics ở phía bên tay phải của toán tử instanceof do loại xóa. – Matthias

+0

Không, đó là _you_ người đang bối rối về nó. Bạn phải sử dụng kiểu thô sau 'instanceof'. –

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