Jak sprawdzić w Javie, czy obiekt jest tablicą bez użycia odbicia? Jak mogę iterować przez wszystkie elementy bez używania refleksji?
Używam Google GWT, więc nie mogę używać odbicia :(
Bardzo chciałbym zaimplementować następujące metody bez użycia refelekcji:
private boolean isArray(final Object obj) {
//??..
}
private String toString(final Object arrayObject) {
//??..
}
BTW: nie chcę też używać JavaScript, aby móc go używać w środowiskach innych niż GWT.
java
arrays
gwt
instanceof
edbras
źródło
źródło
obj.getClass().getComponentType()
.Możesz użyć
instanceof
.Operator porównania typów JLS 15.20.2
instanceof
Oznacza to, że możesz zrobić coś takiego:
Trzeba by sprawdzić, czy przedmiot jest
instanceof boolean[]
,byte[]
,short[]
,char[]
,int[]
,long[]
,float[]
,double[]
, lubObject[]
, jeśli chcesz, aby wykryć wszystkie rodzaje tablic.Ponadto an
int[][]
to aninstanceof Object[]
, więc w zależności od tego, jak chcesz obsługiwać tablice zagnieżdżone, może to się skomplikować.W przypadku
toString
,java.util.Arrays
matoString(int[])
i inne przeciążenia, których możesz użyć. Ma równieżdeepToString(Object[])
dla tablic zagnieżdżonych.Będzie to bardzo powtarzalne (ale nawet
java.util.Arrays
bardzo powtarzalne ), ale tak jest w Javie z tablicami.Zobacz też
źródło
java.util.Arrays
dzieje, tak. Widzę, że czytałeś kod, do którego utworzyłem łącze.Dostęp do każdego elementu tablicy można uzyskać osobno, używając następującego kodu:
Zauważ, że nie trzeba wiedzieć, jakiego rodzaju jest to podstawowa tablica, ponieważ zadziała to dla każdej tablicy.
źródło
isArray()
został już odpowiednio uwzględniony w odpowiedziach zamieszczonych 4 lata wcześniej.Nie ma relacji podtypów między tablicami typu pierwotnego lub między tablicą typu pierwotnego a tablicą typu referencyjnego. Zobacz JLS 4.10.3 .
Dlatego poniższy kod jest niepoprawny jako test służący do sprawdzenia, czy
obj
jest to tablica dowolnego rodzaju :W szczególności nie działa, jeśli
obj
jest 1-D tablicą prymitywów. (Działa to jednak w przypadku tablic prymitywnych o wyższych wymiarach, ponieważ wszystkie typy tablic są podtypamiObject
. Ale w tym przypadku jest to dyskusyjne).Najlepsze rozwiązanie (w
isArray
części tablicowej pytania) zależy od tego, co liczy się jako „użycie odbicia”.W GWT wywołanie
obj.getClass().isArray()
nie liczy się jako użycie odbicia 1 , więc jest to najlepsze rozwiązanie.W przeciwnym razie najlepszym sposobem ustalenia, czy obiekt ma typ tablicowy, jest użycie sekwencji
instanceof
wyrażeń.Możesz także spróbować pograć z nazwą klasy obiektu w następujący sposób, ale wywołanie
obj.getClass()
graniczy z refleksją.1 - Dokładniej,
Class.isArray
metoda jest wymieniona jako obsługiwana przez GWT na tej stronie .źródło
Możesz utworzyć klasę narzędziową, aby sprawdzić, czy klasa reprezentuje kolekcję , mapę lub tablicę
źródło
Po prostu
obj instanceof Object[]
(przetestowane w JShell).źródło