Như những người khác đã đề cập, bạn không thể chuyển một biến lớp đến instanceof
vì một biến lớp tham chiếu đến một thể hiện của Đối tượng , trong khi bên phải của instanceof
phải là một kiểu . Điều đó instanceof
không có nghĩa là "y là một thể hiện của Đối tượng x", nó có nghĩa là "y là một thể hiện của kiểu X". Trong trường hợp bạn không biết sự khác biệt giữa Object và type, hãy xem xét:
Object o = new Object();
Ở đây, kiểu là Object
, và o
là một tham chiếu đến thể hiện của Đối tượng với kiểu đó. Như vậy:
if(o instanceof Object)
là hợp lệ nhưng
if(o instanceof o)
không phải vì o
ở phía bên tay phải là Đối tượng, không phải là một loại.
Cụ thể hơn cho trường hợp của bạn, một cá thể lớp không phải là một kiểu, nó là một Đối tượng (được tạo cho bạn bởi JVM). Trong phương thức của bạn, Class
là một kiểu, nhưng clazz
là một Đối tượng (tốt, một tham chiếu đến một Đối tượng)
Những gì bạn cần là một cách để so sánh một Đối tượng với một Đối tượng Lớp. Nó chỉ ra rằng đây là phổ biến vì vậy đây được cung cấp cho bạn như là một phương pháp của đối tượng Class: isInstance()
.
Đây là Tài liệu Java cho isInstance, giải thích điều này tốt hơn:
public boolean isInstance(Object obj)
Xác định xem Đối tượng được chỉ định có tương thích với phép gán với đối tượng được Đại diện bởi Lớp này hay không. Phương thức này là tương đương động của toán tử instanceof của ngôn ngữ Java. Phương thức trả về true nếu đối số Đối tượng được chỉ định không phải là giá trị rỗng và có thể được chuyển thành kiểu tham chiếu được đại diện bởi đối tượng Lớp này mà không cần nâng cao một ClassCastException. Ngược lại, nó trả về false.
Cụ thể, nếu đối tượng Lớp này đại diện cho một lớp đã khai báo, phương thức này trả về true nếu đối số Đối tượng được chỉ định là một thể hiện của lớp được đại diện (hoặc của bất kỳ lớp con nào của nó); ngược lại nó trả về false. Nếu đối tượng Lớp này đại diện cho một lớp mảng, phương thức này trả về true nếu đối số Đối tượng được chỉ định có thể được chuyển đổi thành một đối tượng của lớp mảng bằng một chuyển đổi danh tính hoặc bằng một chuyển đổi tham chiếu mở rộng; ngược lại nó trả về false. Nếu đối tượng Lớp này đại diện cho một giao diện, phương thức này trả về true nếu lớp hoặc bất kỳ lớp cha nào của đối số Đối tượng được chỉ định triển khai giao diện này; ngược lại nó trả về false. Nếu đối tượng Class này đại diện cho một kiểu nguyên thủy, phương thức này trả về false.
Tham số: obj - đối tượng cần kiểm tra
Trả về: true nếu obj là một thể hiện của lớp này
Kể từ: JDK1.1