Nie wszystkie obiekty Class
reprezentują klasy/typy odniesienia; istnieją również obiekty Class
reprezentujące typy pierwotne. Jest to użyteczne, ponieważ podczas korzystania z odbicia z polami i metodami często trzeba określać ich typ i może to być typ pierwotny. Tak więc Class
jest używany do reprezentowania wszystkich takich typów pre-generics.
Jednak wiele metod z klasy Class
nie ma sensu dla typów pierwotnych. Na przykład niemożliwe jest, aby obiekt był instanceof int
. Dlatego analogiczna metoda .isInstance()
zawsze zwróci false
. Ponieważ parametr tej metody jest typu Object
, z punktu widzenia języka jest po prostu niemożliwe, aby to, co tam przekazałeś, było typu pierwotnego.
Jasne, Java 5+ kiedy przechodzą prymitywne do parametru typu Object
, ulega autoboxing, ale fakt, że przeszedł autoboxing oznacza że to, co zostało przekazane w rzeczywistości jest odniesienie do obiektu. Typy referencyjne i typy pierwotne są różne. Parametr jest typem referencyjnym lub typem pierwotnym. W związku z tym nie można napisać metody, która może przyjąć "referencję lub prymityw".
W twoim przykładzie możesz zadać pytanie, czy obiekt był automatyczny z prymitywu i porównać go z typem pierwotnym. Jednak nie jest możliwe wykrycie, czy osoba dzwoniąca wykonała autoboxing, ponieważ autoboxing to operacja całkowicie wywołująca połączenie, która ma miejsce przed wywołaniem.
Jednak zakładając, że był on autoboxed, wiesz, do jakiego typu powinien był. Jeśli spodziewasz się int
, i jest on autoboxed i przekazywane do twojej metody, to powinno być instancją Integer
.Tak więc, co można zrobić, gdy clazz
reprezentuje typ pierwotny, zamiast tego wykonaj sprawdzenie jego klasy opakowania. Tak więc, gdy widzi, że clazz
jest int.class
, należy go zastąpić przez Integer.class
, a następnie wykonać kontrolę. Zauważ, że w ten sposób nadal nie wiadomo, co zostało przekazane jako parametr o
.
Zamiast używać niezbyt znaczących tagów, takich jak 'int',' types' czy nawet 'isintance', powinieneś oznaczyć pytanie językiem, którego używasz. To przyciągnie więcej widzów, a tym samym zwiększy szansę otrzymania satysfakcjonującej odpowiedzi. –
Sry, zupełnie o tym zapomniałem. ... Domyślam się, że java stała się dla mnie naturalna: D – mike
Czy przeczytałeś [tę odpowiedź] (http://stackoverflow.com/a/7083456/516433) jeszcze? – Lucas