2009-06-04 12 views
73

Chcę sprawdzić, czy obiekt o jest instancją klasy C lub podklasy C.Czy jest coś podobnego instanceOf (klasa <?> c) w Javie?

Na przykład, jeśli p jest klasy Point Chcę x.instanceOf(Point.class) być true a także x.instanceOf(Object.class) być true.

Chcę, aby działała również w przypadku pierwotnych typów pudełek. Na przykład, jeśli x jest Integer, wówczas x.instanceOf(Integer.class) powinno być true.

Czy jest coś takiego? Jeśli nie, jak mogę wdrożyć taką metodę?

+0

obsługi klas zapakowane jest trochę niechlujny – dfa

Odpowiedz

141

Class.isInstance robi to, co chcesz.

if (Point.class.isInstance(someObj)){ 
    ... 
} 

Oczywiście, nie należy go używać, jeśli można użyć zamiast instanceof, ale dla scenariuszy odbicia często przydaje.

+0

Dlaczego nie powinniśmy używać? jakiś problem z wydajnością? – Ahamed

+6

@Ahamowany to prawdopodobnie wolniej, ale co gorsza, trudniej to zrozumieć! Jeśli istnieje bardzo prosty sposób na zrobienie czegoś - np. 'If (instancja Point)' - ale robisz to w bardziej zawiły sposób, ktokolwiek czyta kod, musi myśleć "o, musi być powód dla tego robi się to na własnej skórze ", a następnie przeskakuję do dokumentacji, aby dowiedzieć się, w jaki sposób' Class.isInstance' różni się od 'instanceof'. Marnujesz czas swoich kolegów. – gustafc

8
x instanceof Integer 
x instanceof Object 

po prostu trzeba użyć prawego składnię

dla primitve typów, trzeba zrobić to zupełnie inaczej. Ponieważ nie można tworzyć dla nich metod, potrzebna jest klasa, która zachowuje metodę. Więc zamiast "x.instanceOf (Integer.Class)", musisz wywołać "MyClassComparer.instanceOf (x, Integer.Class)" lub coś w tym stylu. Można to łatwo zaimplementować poprzez przeciążanie metod, ale nie widzę przypadku, w którym taka funkcjonalność byłaby w ogóle pożądana.

0

można zrobić:

if (foo instanceof classNameYouWantToCheck) 
+0

nie można używać instanceof z prymitywnych typów – dfa

+0

Klasa była po prostu pokazać powinien napisać tam nazwa klasy. Naprawię to – fmsf

4

W rzeczywistości w Javie istnieje logiczna operator nazywany jest instancją, która może być używana do określenia, czy dany obiekt jest instancją klasy, instancją podklasy lub wystąpienie klasy, która implementuje określony interfejs.

if(obj instanceof SomeClass) { 
    // Do something 
} 

Java Tutorial ma good example tego operatora

+1

nie można użyć instanceof z typami pierwotnymi – dfa

+4

Myli typy pierwotne z obiektami. Proszę przeczytać ... "Na przykład, jeśli x jest liczbą całkowitą, wtedy x.instanceOf (Integer.class), a także x.instanceOf (Object.class) powinny być prawdziwe." Wstyd, że głosujesz na wszystkie odpowiedzi. –

+0

Oddelegowanie (sp) sugestii użycia samouczka Java. Jest to dobre odniesienie do nauki samego języka. –

19

Chcę sprawdzić, czy obiekt o to instancja klasy C lub z podklasy C. Na przykład, jeśli p jest klasy Punktu Chcę x.instanceOf (Point.class)

Um ... Co? Co to są o, p i x?

Chcę, aby działał także dla pierwotnych typów . Na przykład, jeśli x jest liczbą całkowitą , wówczas x.instanceOf (Integer.class), a także x.instanceOf (Object.class) powinno być prawdziwe.

Nie. Nie powinno się nawet kompilować. Prymitywy nie są obiektami i nie można na nich wywoływać metod.

W każdym razie, są trzy rzeczy, z których jeden na pewno może osiągnąć to, co chcesz (różnią się one nieco w którym dokładnie zastosować:

  • Operator instanceof jeśli znasz klasę w czasie kompilacji.
  • Class.isInstance() jeśli chcesz sprawdzić klasę obiektu względem klasy nieznanej w czasie kompilacji.
  • Class.isAssignableFrom() jeśli chcesz sprawdzić przypisywalność dla dwóch obiektów klasy.
0

"Chcę, aby działał także dla typów pierwotnych, na przykład, jeśli x jest liczbą całkowitą, wtedy x.instanceOf (klasa Integer.class), a także x.instanceOf (klasa Object.class) powinny być prawdziwe."

Dlaczego? Rodzaje prymitywów i typy referencyjne są całkowicie oddzielne. Pierwotna int nie jest podtypem Integer ani Object. Typ wartości pierwotnej zawsze jest statycznie znany w czasie kompilacji, więc nie ma sensu testowanie jej typu. Oczywiście, możesz wpisać prymitywną wartość, a następnie przetestować jej typ:

(Integer)5 instanceof Integer 

Ale jaki byłby sens?

-1

myślę, że jesteś zagubiony instanceof dla surowych obiektów i jedynek generycznych

obj instanceof Class 
obj instanceof Class<?> // this is the one you want 
+1

Nie można używać generycznych po prawej stronie operatora instanceof z powodu usunięcia typu. – Matthias

+0

Nie, to ty jesteś tym zdezorientowany. Musisz użyć typu surowego po 'instanceof'. –