Không phải tất cả các đối tượng Class
đại diện cho các lớp/loại tham chiếu; cũng có Class
đối tượng đại diện cho các loại nguyên thủy. Điều này rất hữu ích vì trong việc sử dụng sự phản chiếu với các trường và các phương thức, bạn thường cần phải xác định kiểu của chúng, và nó có thể là một kiểu nguyên thủy. Vì vậy, Class
được sử dụng để đại diện cho tất cả các loại tiền như thế này.
Tuy nhiên, nhiều phương pháp của lớp Class
không có ý nghĩa đối với các loại nguyên thủy. Ví dụ, đối tượng không thể là instanceof int
. Do đó, phương thức tương tự .isInstance()
sẽ luôn trả về false
. Vì tham số của phương thức đó là loại Object
, nó chỉ đơn giản là không thể từ một điểm ngôn ngữ của xem cho những gì bạn vượt qua trong đó để có một kiểu nguyên thủy.
Chắc chắn, trong Java 5 + khi bạn vượt qua một nguyên thủy với một tham số kiểu Object
, nó phải trải qua autoboxing, nhưng thực tế là nó đã trải qua autoboxing nghĩa rằng những gì đã được thông qua thực sự là một tham chiếu đến một đối tượng. Các kiểu tham chiếu và kiểu nguyên thủy là khác biệt. Tham số là loại tham chiếu hoặc kiểu nguyên thủy. Vì vậy, bạn không thể viết một phương thức có thể lấy một "tham chiếu hoặc nguyên thủy".
Những gì bạn có thể yêu cầu, trong ví dụ của bạn, là để phát hiện rằng đối tượng đã được hộp tự động từ nguyên thủy và so sánh nó với kiểu nguyên thủy. Tuy nhiên, không thể phát hiện xem người gọi có tự động đóng hộp đó hay không, vì tính năng autoboxing là một hoạt động hoàn toàn người gọi xảy ra trước cuộc gọi.
Tuy nhiên, giả sử nó đã được tự động đóng hộp, bạn biết loại nó nên đi đến. Nếu bạn đang mong đợi một số int
và được tự động chuyển và được chuyển đến phương thức của bạn, nó phải là một phiên bản của Integer
.Vì vậy, những gì bạn có thể làm là, khi clazz
đại diện cho một loại nguyên thủy, thay vào đó thực hiện kiểm tra trên lớp bao bọc của nó. Do đó, khi thấy rằng clazz
là int.class
, hãy thay thế bằng Integer.class
và sau đó thực hiện kiểm tra. Lưu ý rằng cách này vẫn không cho biết điều gì đã được truyền khi thông số o
được tự động đóng hộp.
Thay vì sử dụng các thẻ không có ý nghĩa như 'int',' types' hoặc thậm chí 'isintance', bạn nên gắn thẻ câu hỏi bằng ngôn ngữ bạn đang sử dụng. Điều đó sẽ thu hút nhiều người xem hơn và do đó làm tăng cơ hội để bạn nhận được câu trả lời thỏa mãn. –
Sry, tôi hoàn toàn quên điều đó. ... Tôi đoán java đã trở nên tự nhiên với tôi: D – mike
Bạn đã đọc [câu trả lời này] (http://stackoverflow.com/a/7083456/516433) chưa? – Lucas