Chcę sprawdzić, czy obiekt o
jest instancją klasy C
lub podklasy klasy C
.
Na przykład, jeśli p
jest z klasy, Point
to chcę x.instanceOf(Point.class)
być true
i 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 x
jest, Integer
to x.instanceOf(Integer.class)
powinno być true
.
Czy jest coś takiego? Jeśli nie, jak mogę wdrożyć taką metodę?
Odpowiedzi:
Class.isInstance robi, co chcesz.
if (Point.class.isInstance(someObj)){ ... }
Oczywiście nie powinieneś go używać, jeśli możesz
instanceof
zamiast tego użyć , ale w scenariuszach refleksji często się przydaje.źródło
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ę, czymClass.isInstance
różni się odinstanceof
. Marnujesz czas swoich kolegów.Co? Jakie są O, P i X?
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:
instanceof
Operator jeśli znasz klasę w czasie kompilacji.źródło
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.
źródło
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
źródło
Możesz to zrobić:
if (foo instanceof classNameYouWantToCheck)
źródło
„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?
źródło
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
źródło
instanceof
.