Wie kann man sehen, ob ein Objekt ein Array ist, ohne Reflektion zu verwenden?
Lesezeit: 5 Minuten
Edbras
Wie kann ich in Java sehen, ob ein Objekt ein Array ist, ohne Reflektion zu verwenden? Und wie kann ich alle Elemente durchlaufen, ohne Reflektion zu verwenden?
Ich verwende Google GWT, daher darf ich keine Reflektion verwenden 🙁
Ich würde gerne die folgenden Methoden implementieren, ohne Reflexion zu verwenden:
Zur Laufzeit wird das Ergebnis der instanceof Betreiber ist true wenn der Wert der RelationalerAusdruck ist nicht null und der Verweis könnte auf die gegossen werden Referenztyp ohne a zu erhöhen ClassCastException. Ansonsten ist das Ergebnis false.
Das heißt, Sie können Folgendes tun:
Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"
Sie müssten prüfen, ob das Objekt ein ist instanceof boolean[], byte[], short[], char[], int[], long[], float[], double[]oder Object[]wenn Sie alle Array-Typen erkennen möchten.
Auch ein int[][] ist ein instanceof Object[]je nachdem, wie Sie mit verschachtelten Arrays umgehen möchten, kann es also kompliziert werden.
Für die toString, java.util.Arrays hat ein toString(int[]) und andere Überladungen, die Sie verwenden können. Es hat auch deepToString(Object[]) für verschachtelte Arrays.
public String toString(Object arr) {
if (arr instanceof int[]) {
return Arrays.toString((int[]) arr);
} else //...
}
Verwaltung von sich stark wiederholendem Code und Dokumentation in Java
Java Arrays.equals() gibt false für zweidimensionale Arrays zurück.
Danke, war mir nicht bewusst, dass es so einfach ist. Dachte, dass instanceof nicht direkt mit T verwendet werden könnte[] 🙁
– Edbras
28. April 2010 um 7:44 Uhr
Übrigens: Ich habe auch eine andere nette Möglichkeit bemerkt, um herauszufinden, ob etwas ein Array Class.isArray() ist (verwendet in Arrays.deepToString()).
– Edbras
28. April 2010 um 8:35 Uhr
@edbras: ja, das hat Steve Kuo unten gesagt. Meine Lösung verwendet ein reines linguistisches Konstrukt anstelle eines API-Aufrufs.
– polygenelubricants
28. April 2010 um 8:38 Uhr
Es funktioniert gut, ich verwende nur nicht instanceof, sondern getClass als Vergleich. So etwas wie: if (array.getClass == int[].class) {Arrays.toString((int[]) Array); } Danke an alle..
– Edbras
28. April 2010 um 11:05 Uhr
@edbras: So ist es java.util.Arrays geht, ja. Ich sehe, dass Sie den von mir verlinkten Code gelesen haben.
– polygenelubricants
28. April 2010 um 11:16 Uhr
Benutzer1928596
Mit dem folgenden Code kann man auf jedes Element eines Arrays separat zugreifen:
Beachten Sie, dass Sie nicht wissen müssen, um welche Art von Array es sich handelt, da dies für jedes Array funktioniert.
isArray() wurde in den Antworten, die 4 Jahre vor dieser gepostet wurden, bereits ausreichend behandelt.
– Jason C
17. November 2014 um 4:47 Uhr
Diese Antwort ist großartig, weil sie uns zeigt, wie man die Größe eines Arrays erhält und ein Element ohne Kenntnis seines Inhaltstyps abruft. Ich bin mir sicher, dass die meisten Leute noch nie einen solchen Code geschrieben haben.
– Christoph Yang
13. Januar 2015 um 5:40 Uhr
@MaartenBodewes – würde ich verwenden dieser Link zu entscheiden, was “keine Reflektion verwenden” für GWT bedeutet.
– Stefan C
12. November 2018 um 23:59 Uhr
Stefan C
Es gibt keine Subtypisierungsbeziehung zwischen Arrays eines primitiven Typs oder zwischen einem Array eines primitiven Typs und einem Array eines Referenztyps. Sehen JLS 4.10.3.
Daher ist das Folgende als Test falsch, um festzustellen, ob obj ist ein Array jeglicher Art:
Insbesondere funktioniert es nicht, wenn obj ist ein 1-D-Array von Grundelementen. (Es funktioniert jedoch für primitive Arrays mit höheren Dimensionen, da alle Array-Typen Untertypen von sind Object. Aber das ist in diesem Fall strittig.)
Ich verwende Google GWT, daher darf ich keine Reflektion verwenden 🙁
Die beste Lösung (zum isArray Array-Teil der Frage) hängt davon ab, was als “Reflexion verwenden” gilt.
In GWT anrufen obj.getClass().isArray() zählt nicht als Verwendung von Reflektion1das ist also die beste Lösung.
Andernfalls ist der beste Weg, um herauszufinden, ob ein Objekt einen Array-Typ hat, die Verwendung einer Folge von instanceof Ausdrücke.