2009-05-05 43 views
8

Tôi đang cố gắng xác định loại lớp của một lớp bằng cách sử dụng sự phản chiếu và sau đó làm điều gì đó cụ thể. Ví dụ, nếu lớp là một đôi, sử dụng một phương pháp cụ thể đôi.Làm cách nào để so sánh các lớp học bằng cách sử dụng sự phản chiếu?

Tôi đang cố gắng sử dụng


    if(f.getClass() == Double.class) 

Tuy nhiên, tôi nhận được một lỗi biên dịch:

"? Loại toán hạng không tương thích Lớp < chụp # 1-of mở rộng Dòng > và Class < đúp >"

Cách thích hợp để thực hiện việc này là gì?

Chỉnh sửa: để rõ ràng hơn

f thuộc loại Field. thu được bằng cách phản chiếu trong một vòng lặp


    (Field f : instance.getDeclaredFields()) 

Trả lời

6

thông báo lỗi Thú vị (Tôi không biết '==' nhà điều hành sẽ kiểm tra những). Nhưng dựa trên nó, tôi nghi ngờ rằng so sánh của bạn là sai: bạn đang cố gắng xem liệu lớp Field (về mặt lý thuyết là siêu lớp của nó, nhưng chỉ trong lý thuyết - Trường là cuối cùng) giống như Double.class, mà nó không thể được.

Vì vậy: có, so sánh sẽ hoạt động, iff bạn đưa ra các đối số phù hợp. Vì vậy, tôi nghi ngờ bạn muốn làm:

nếu (f.getType() == Đôi.class)

thay thế. Và điều đó sẽ hiệu quả, cho rằng Double là một lớp cuối cùng. Nếu không, "isAssignableFrom" sẽ phù hợp hơn.

1

Cách đơn giản nhất sẽ là

if (f.getClass().equals(Double.class)) 

Edit: Ah, bây giờ tôi thấy vấn đề. Lỗi bạn nhận được là vì (do kết quả của generics) trình biên dịch có thể nói rằng các lớp sẽ không bao giờ bằng nhau (Field.class không thể bằng Double.class). Sử dụng .equals() biến nó thành một cảnh báo thay vì một lỗi, nhưng nó vẫn sai mã.

Field.getType() cung cấp cho bạn loại trường. Vì điều này không thể biết được tại thời gian biên dịch, bạn sẽ không gặp lỗi nếu bạn sử dụng toán tử == như ban đầu.

+0

này không làm việc theo cách tôi muốn. Cảm ơn sự giúp đỡ, tôi tình cờ gặp câu trả lời và đã đăng nó. – kgrad

3

Nếu bạn có các đối tượng sau đó sử dụng

if (f instanceof Double) { } 

Một điều thú vị là phương pháp isAssignableFrom:

if (f.getClass().isAssignableFrom (Double.class)) { } 

Nhưng nói chung đó là một phong cách xấu. Sử dụng đa hình để thực hiện logic phụ thuộc vào loại lớp.


Trả lời cho nhận xét: f instanceof Đôi hoạt động tốt.

Bạn có thể viết một cái gì đó như thế này:

float f = 1.1f; 
if (f instanceof Double) { ..} 

Và thông minh java biên dịch nói rằng bạn đã có CE. NHƯNG:

public static boolean isInstanceOfDouble (Object obj) { 
    return obj instanceof Double; 
} 

psvm (String [] args) { 
    sout (isInstanceOfDouble (1.1f); 
} 

..this hoạt động tốt

+0

Đó không phải lúc nào cũng giống nhau. Nếu Double không phải là một lớp cuối cùng, hai sẽ khác nếu f xảy ra là một lớp con. –

+0

f instanceof Double cung cấp một lỗi trình biên dịch. – kgrad

+0

Vâng, như bạn có thể thấy tôi đã viết "thú vị", nó có nghĩa là "đọc javadocs để biết thêm chi tiết". Dù sao tôi thích các giải pháp OOP – Roman

1

Bạn nên sử dụng getType() để có được các loại cơ bản, không nhận được lớp. getType() trả về lớp của kiểu cơ bản theo yêu cầu.

mã trông như thế này:


    if(f.getType().equals(Double.class)) 
+0

Đó là câu trả lời cho một câu hỏi hoàn toàn khác. getType() là đặc trưng cho lớp Field, trong khi getClass() áp dụng cho tất cả các đối tượng. –

+0

Câu hỏi là cụ thể để phản ánh ... – kgrad

+0

Nhưng bạn có nhận thấy rằng cả La Mã và tôi đã đưa ra câu trả lời mà không có ý nghĩa? Cả hai chúng tôi đều trả lời câu hỏi ban đầu của bạn. (Tôi đã cập nhật câu trả lời của mình để giải thích vấn đề thực sự ở đây.) –

0

Sau Đoạn mã nên hoạt động hoàn hảo:

if (f.getType() == Double.TYPE) 

BTW, không == cũng không equals công trình cho Số loại theo thử nghiệm của tôi (JRE7)

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