2009-05-05 12 views
8

Próbuję określić typ klasy za pomocą refleksji, a następnie zrobić coś konkretnego. Na przykład, jeśli klasa jest podwójna, użyj podwójnej określonej metody.Jak porównać klasy za pomocą odbicia?

Ja próbuje użyć


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

Jednak ja dostaję błąd kompilatora:

"? Niezgodne typy argumentów operacji Klasa < capture # 1 z rozszerza pole > i klasę < Pokój >"

Jaki jest właściwy sposób na zrobienie tego?

Edit: być bardziej jasne

f jest typu Field. uzyskane przez odbicie w pętli


    (Field f : instance.getDeclaredFields()) 

Odpowiedz

6

Ciekawe komunikat o błędzie (nie wiem '==' operator będzie sprawdzić te). Ale na tej podstawie podejrzewam, że twoje porównanie jest błędne: próbujesz sprawdzić, czy klasa Field (teoretycznie jej super-klasa, ale tylko w teorii - Field is final) jest taka sama jak Double.class, której nie może być.

A więc: tak, porównanie powinno zadziałać, podaję właściwe argumenty. Więc podejrzewam, że chcesz zrobić:

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

zamiast. I to powinno zadziałać, biorąc pod uwagę, że Double to klasa ostateczna. W przeciwnym razie właściwsze byłoby "isAssignableFrom".

1

Najprostszym sposobem byłoby

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

Edit: Ach, teraz widzę problemu. Błąd, który dostałeś, ponieważ (w wyniku generycznych) kompilator mógł powiedzieć, że klasy nigdy nie będą równe (Field.class nie może równać się Double.class). Użycie .equals() zmienia go w ostrzeżenie zamiast błędu, ale nadal jest to błędny kod.

Field.getType() podaje typ pola. Ponieważ nie można tego ustalić w czasie kompilacji, nie otrzymasz błędu, jeśli użyjesz operatora ==, tak jak pierwotnie.

+0

to nie działa tak chciałbym. Dzięki za pomoc, natknąłem się na odpowiedź i opublikowałem ją. – kgrad

3

Jeśli masz przedmioty następnie użyć metody

if (f instanceof Double) { } 

Inną ciekawą rzeczą jest isAssignableFrom:

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

Ale w ogóle to zły styl. Użyj polimorfizmu do implementacji logiki, która zależy od typów klas.


Odpowiedź na komentarz: f instanceof Double works fine.

Prawdopodobnie napisał coś takiego:

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

i Smart Java kompilator mówi, że masz CE. ALE:

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

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

..this działa dobrze

+0

To nie zawsze jest to samo. Gdyby Double nie był końcową klasą, te dwie byłyby inne, gdyby f była podklasą. –

+0

f instanceof Double daje błąd kompilatora. – kgrad

+0

Tak, jak widzisz, napisałem "interesujące", to znaczy "przeczytaj javadocs po więcej szczegółów". W każdym razie wolę rozwiązania OOP – Roman

1

Należy używać GetType(), aby uzyskać typ podstawowy, a nie dostać klasę. Metoda getType() zwraca klasę bazowego typu zgodnie z wymaganiami.

kod wygląda następująco:


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

To jest odpowiedź na zupełnie inne pytanie. getType() jest specyficzne dla klasy Field, a getClass() dotyczy wszystkich obiektów. –

+0

Pytanie dotyczy refleksji ... – kgrad

+0

Ale czy zauważyłeś, że zarówno Roman, jak i ja udzieliliśmy odpowiedzi, które nie miały sensu? Oboje odpowiadaliśmy na twoje pierwotne pytanie. (Zaktualizowałem swoją odpowiedź, aby wyjaśnić tutaj prawdziwy problem). –

0

następstwie urywek kodu powinny działać idealnie:

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

BTW, ani == ani equals prace dla numer typów według mojego testu (JRE7)

Powiązane problemy