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ę?

wąż
źródło
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.

gustafc
źródło
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:

Michael Borgwardt
źródło
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.

Erich Kitzmueller
źródło
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

Wiktor Hugo
źródło
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) 
fmsf
źródło
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?

newacct
źródło
-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
Paul Bors
źródło
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