2010-04-07 32 views

Trả lời

111

Toán tử instanceof hoạt động trên các loại tham chiếu, như Integer và không hiển thị trên các đối tượng, như new Integer(213). Bạn có thể muốn một cái gì đó giống như

clazz.isInstance(obj) 

Side lưu ý: mã của bạn sẽ ngắn gọn hơn nếu bạn viết

public boolean isOf(Class clazz, Object obj){ 
    return clazz.isInstance(obj) 
} 

Không thực sự chắc chắn nếu bạn cần một phương pháp nữa, mặc dù.

+0

tôi biết mã là hoàn toàn vô dụng , Tôi chỉ muốn chứng minh sự nhầm lẫn của tôi :) – eric2323223

+6

'Số nguyên' là ** không ** một lớp chữ. 'Integer.class' sẽ là một lớp theo nghĩa đen (xem § 15.8.2 của JLS: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.8.2). Toán tử 'instanceof' nhận một" ReferenceType "(hay còn gọi là tên kiểu) như được chỉ định § 15.20.2 của JLS: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html# 15.20.2 –

+2

Tôi muốn sử dụng 'clazz.isInstance (obj)' vì đối tượng đã được cung cấp. –

12

instanceof chỉ có thể được sử dụng với tên lớp rõ ràng (được nêu tại thời gian biên dịch). Để làm được một runtime kiểm tra, bạn nên làm:

clazz.isInstance(obj) 

này có một lợi thế nhỏ hơn clazz.isAssignableFrom(..) vì nó thỏa thuận với trường hợp obj == null tốt hơn.

3

Thứ nhất, instanceof yêu cầu toán hạng bên phải là một lớp thực tế (ví dụ: obj instanceof Object hoặc obj instanceof Integer) và không phải là loại biến Class. Thứ hai, bạn đã thực hiện một sai lầm người mới khá phổ biến mà bạn thực sự không nên làm ... mẫu sau:

 
if (conditional_expression){ 
    return true; 
} else{ 
    return false; 
} 

Trên đây có thể được refactored thành:

 
return conditional_expression; 

Bạn nên luôn luôn thực hiện refactoring rằng , vì nó loại bỏ một dự phòng nếu ... câu lệnh khác. Tương tự, biểu thức return conditional_expression ? true : false; có thể được tái cấu trúc cho cùng một kết quả.

+2

Đó không phải là sai lầm. Có lẽ vụng về nhưng không sao cả. Có thể bạn muốn mã bổ sung trước khi trở lại trong tương lai gần ... –

2

Như những người khác đã đề cập, bạn không thể vượt qua một biến lớp học để instanceof vì một biến lớp học tài liệu tham khảo một thể hiện của một Object, trong khi tay phải của instanceof có phải là một loại . Tức là, 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 loại X". Trong trường hợp bạn không biết sự khác biệt giữa một đối tượng và một loại, xem xét:

Object o = new Object();

Ở đây, loại là Object, và o là một tham chiếu đến thể hiện của đối tượng với loại đó. 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à một đối tượng, không phải là một kiểu.

Cụ thể hơn cho trường hợp của bạn, một phiên bản lớp không phải là một loại, nó là một đối tượng (được JVM tạo cho bạn). Trong phương pháp của bạn, Class là một loại, nhưng clazz là một đối tượng (tốt, tham chiếu đến một đối tượng)

Điều bạn cần là cách so sánh đối tượng với đối tượng lớp. Nó chỉ ra rằng điều này là phổ biến vì vậy điều nà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à Doc Java cho isinstance, mà giải thích điều này tốt hơn:

public boolean isInstance(Object obj)

Xác định đối tượng được quy định là nhiệm vụ tương thích với đối tượng đại diện bởi lớp này. Phương thức này là tương đương động của toán tử instanceof ngôn ngữ Java. Phương thức trả về true nếu đối số Object được chỉ định là không null và có thể là truyền đến kiểu tham chiếu được đại diện bởi đối tượng Class này mà không cần tăng ClassCastException. Nó trả về false nếu không.

Cụ thể, nếu đối tượng Lớp này đại diện cho lớp được khai báo, phương thức trả về true nếu đối số Đối tượng được chỉ định là một thể hiện của lớp đại diện (hoặc của bất kỳ lớp con nào); nó trả về false nếu không. Nếu đối tượng Class 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ố Object đã chỉ định có thể được chuyển đổi thành đối tượng của lớp mảng bằng chuyển đổi danh tính hoặc bằng một chuyển đổi tham chiếu mở rộng; nó trả về false nếu không. Nếu đối tượng Class 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 nào của đối số được chỉ định thực hiện giao diện này; nó trả về false nếu không. Nếu đối tượng Lớp này đại diện cho một loại nguyên thủy , phương thức này trả về false.

Tham số: obj - đối tượng để kiểm tra
Returns: đúng nếu obj là một thể hiện của lớp này
Từ: JDK1.1

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