Có cái gì đó giống như instanceOf (Class <?> C) trong Java không?


87

Tôi muốn kiểm tra xem một đối tượng olà một thể hiện của lớp Chay của một lớp con của C.

Ví dụ, nếu plà đẳng cấp Pointmà tôi muốn x.instanceOf(Point.class)trở thành truevà cũng x.instanceOf(Object.class)sẽ trở thành true.

Tôi muốn nó cũng hoạt động cho các loại nguyên thủy đóng hộp. Ví dụ, nếu xlà một Integerthì x.instanceOf(Integer.class)nên được true.

Có một điều như vậy? 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?


xử lý các lớp đóng hộp hơi lộn xộn
dfa

Câu trả lời:


172

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 instanceofthay thế, nhưng đối với các tình huống phản chiếu, nó thường có ích.


6
@ Xấu hổ là nó có thể chậm hơn, nhưng điều tồi tệ hơn là nó khó hiểu hơn! Nếu có một cách rất đơn giản để làm điều gì đó - chẳng hạn như if (a instanceof Point)- nhưng bạn thực hiện nó theo cách phức tạp hơn, thì bất kỳ ai đọc mã đều nhất định nghĩ rằng "ồ, 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 tài liệu để tìm hiểu sự Class.isInstancekhác biệt với instanceof. Bạn làm lãng phí thời gian của đồng nghiệp.
gustafc

21

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

Ừm ... Cái gì? O, p và x là gì?

Tôi muốn nó cũng 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 (Integer.class) và x.instanceOf (Object.class) phải đúng.

Không. 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 hơi khác nhau về nơi áp dụng chính xác:

  • Các instanceofnhà điều hành 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 một đối tượng so với một lớp chưa biết tại thời điểm 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.

9
x instanceof Integer
x instanceof Object

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

đối với các loại primitve, bạn phải làm điều đó hoàn toàn khác. Vì bạn không thể tạo 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 tương tự như vậy. Điều này có thể dễ dàng được thực hiện bằng các phương thức nạp chồng, nhưng tôi không gặp trường hợp nào khi chức năng đó có thể được mong muốn.


4

Trên thực tế, trong Java có một toán tử boolean được gọi là instanceof 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, một thể hiện của lớp con hay một thể hiện của lớp thực thi một giao diện cụ thể.

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

Hướng dẫn Java có một ví dụ điển hình về 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 loại nguyên thủy với các đối tượng. Vui lòng đọc ... "Ví dụ: nếu x là 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
victor hugo

Phân biệt (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ữ của chính nó.
luis.espinal

0

Bạn có thể làm:

if (foo instanceof classNameYouWantToCheck) 

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

Lớp học chỉ để cho thấy anh ấy nên viết tên lớp ở đó. Tôi sẽ sửa nó
fmsf

0

"Tôi muốn nó cũng hoạt động với các kiểu nguyên thủy. Ví dụ: nếu x là số nguyên thì x.instanceOf (Integer.class) và x.instanceOf (Object.class) cũng 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 cũng như Object. Kiểu của một giá trị nguyên thủy luôn được biết một cách tĩnh tại thời điểm biên dịch, vì vậy không có ích gì khi kiểm tra kiểu của nó. Chắc chắn, bạn có thể đóng hộp một giá trị nguyên thủy và sau đó kiểm tra kiểu của nó:

(Integer)5 instanceof Integer

thế vấn đề là gì nào?


-2

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

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

2
Bạn không thể sử dụng generic ở phía bên phải của toán tử instanceof do xóa kiểu.
Matthias

2
Không, chính bạn mới là người bối rối về nó. Bạn phải sử dụng loại thô sau khi instanceof.
Dawood ibn Kareem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.