Czy w Javie jest coś takiego jak instanceOf (Class <?> C)?


87

Chcę sprawdzić, czy obiekt ojest instancją klasy Club podklasy klasy C.

Na przykład, jeśli pjest z klasy, Pointto chcę x.instanceOf(Point.class)być truei też x.instanceOf(Object.class)być true.

Chcę, aby działało również dla pudełkowych typów pierwotnych. Na przykład, jeśli xjest, Integerto x.instanceOf(Integer.class)powinno być true.

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


obsługa klas pudełkowych jest trochę kłopotliwa
dfa

Odpowiedzi:


172

Class.isInstance robi, co chcesz.

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

Oczywiście nie powinieneś go używać, jeśli możesz instanceofzamiast tego użyć , ale w scenariuszach refleksji często się przydaje.


6
@ Szkoda, że ​​prawdopodobnie wolniej, ale co gorsza, trudniej go zrozumieć! Jeśli istnieje bardzo prosty sposób na zrobienie czegoś - na przykład if (a instanceof Point)- ale robisz to w bardziej zawiły sposób, ktokolwiek czyta kod, z pewnością pomyśli „o, musi być powód, dla którego robi się to na własnej skórze” i następnie przejdź do dokumentów, aby dowiedzieć się, czym Class.isInstanceróżni się od instanceof. Marnujesz czas swoich kolegów.
gustafc

21

Chcę sprawdzić, czy obiekt o jest instancją klasy c lub podklasy c. Na przykład, jeśli p jest klasy Point I want x.instanceOf (Point.class)

Co? Jakie są O, P i X?

Chcę, żeby działało również dla typów prymitywnych. Na przykład, jeśli x jest liczbą całkowitą, to x.instanceOf (Integer.class), a także x.instanceOf (Object.class) powinny być prawdziwe.

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

W każdym razie są trzy rzeczy, z których jedna może zdecydowanie osiągnąć to, czego chcesz (różnią się one nieco tym, gdzie dokładnie mają zastosowanie:


9
x instanceof Integer
x instanceof Object

wystarczy użyć odpowiedniej składni

w przypadku prymitywnych typów musisz to zrobić zupełnie inaczej. Ponieważ nie możesz tworzyć dla nich metod, potrzebujesz klasy, która zachowuje metodę. Więc zamiast „x.instanceOf (Integer.Class)”, musisz wywołać „MyClassComparer.instanceOf (x, Integer.Class)” lub coś w tym rodzaju. Można to łatwo zaimplementować metodami przeciążania, ale nie widzę przypadku, w którym ta funkcjonalność byłaby w ogóle pożądana.


4

W rzeczywistości w Javie istnieje operator logiczny o nazwie instanceof, którego można użyć do określenia, czy obiekt jest instancją klasy, instancją podklasy, czy instancją klasy implementującej określony interfejs.

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

W samouczku Java znajduje się dobry przykład tego operatora


1
nie możesz używać instanceof z typami pierwotnymi
dfa

4
Pomylił typy prymitywne z przedmiotami. Przeczytaj ... "Na przykład, jeśli x jest liczbą całkowitą, wówczas x.instanceOf (Integer.class), a także x.instanceOf (Object.class) powinny być prawdziwe." Wstyd, że odrzucasz wszystkie odpowiedzi
Victor Hugo

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

0

Możesz to zrobić:

if (foo instanceof classNameYouWantToCheck) 

nie możesz używać instanceof z typami pierwotnymi
dfa

Klasa miała tylko pokazać, że powinien tam wpisać nazwę klasy. Naprawię to
fmsf

0

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

Czemu? Typy pierwotne i typy referencyjne są całkowicie oddzielne. Prymityw int nie jest podtypem Integer ani Object. Typ wartości pierwotnej jest zawsze znany statycznie w czasie kompilacji, więc nie ma sensu testować jego typu. Jasne, możesz umieścić prymitywną wartość, a następnie przetestować jej typ:

(Integer)5 instanceof Integer

Ale po co?


-2

Myślę, że jesteś zdezorientowany co do instancji obiektów surowych i ogólnych

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

2
Nie można używać typów ogólnych po prawej stronie operatora instanceof z powodu wymazywania typów.
Matthias

2
Nie, to ty jesteś zdezorientowany. Następnie musisz użyć surowego typu instanceof.
Dawood ibn Kareem
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.