[Java] Vorsichtsmaßnahmen beim Konvertieren von Argumentparametern variabler Länge in ein Array

Wenn Sie beim Spielen mit Reflexion oder JMockits Deencapsulation nicht aufpassen, denke ich, dass dies ein ziemlich guter Punkt ist, also habe ich ihn zusammengefasst.

Bewegen Sie sich vorerst mit verschiedenen Mustern

Main.java



public class Main {

    public static void main(String[] args) {

        // 1
        test(1, "a", "b", "c");

        // 2
        test(2, new String[] { "a", "b", "c" });

        // 3
        test(3, new String[] { "a", "b", "c" }, "d");

        // 4
        test(4, new int[] { 1, 2, 3 });

    }

    private static void test(int number, Object... args) {

        System.out.println("No." + number + " length = " + args.length);

    }

}

Werte werden in verschiedenen Mustern an die Argumentparameter variabler Länge übergeben, und die Größe des empfangenen Parameters wird ausgegeben. Wie wird es an die Konsole ausgegeben?

Ausgabeergebnis

Konsole


No.1 length = 3
No.2 length = 3
No.3 length = 2
No.4 length = 1

Kommentar

Es ist leicht zu verstehen, wenn Sie wissen, dass die Definition von Argumenten variabler Länge tatsächlich ein Array ist, und überlegen, wie sie zur Kompilierungszeit aussehen wird.

Der Empfänger wird zur Kompilierungszeit in eine Methode mit den folgenden Argumenten konvertiert.

private static void test(int number, Object[] args) {
    ...
}

No.1

Zur Kompilierungszeit in das empfangende Array konvertiert.

test(1, new Object[]{"a", "b", "c"});

Die Größe wird 3 sein.

No.2

Es wird keine Konvertierung durchgeführt, da das Array bereits kovariant ist.

test(2, new String[]{"a", "b", "c"});

Die Größe wird 3 sein.

No.3

Zur Kompilierungszeit in das empfangende Array konvertiert.

test(3, new Object[] { new String[] { "a", "b", "c" }, "d" });

Die Größe wird 2 sein.

No.4

Obwohl es sich bereits um ein Array handelt, kann das Array vom primitiven Typ nicht wie es ist in das Objektarray umgewandelt werden, sodass es zur Kompilierungszeit in den im Objektarray eingeschlossenen Status konvertiert wird.

test(4, new Object[] { new int[] { 1, 2, 3 } });

Die Größe wird 1 sein.

Nachwort

//No.2 length = 1
test(2, (Object) new String[]{"a", "b", "c"});

Recommended Posts

[Java] Vorsichtsmaßnahmen beim Konvertieren von Argumentparametern variabler Länge in ein Array
[Java] Flache Kopie und tiefe Kopie beim Konvertieren eines Arrays in eine Liste
<Java> Beim Erstellen eines zweidimensionalen Arrays mit fester Länge (Zeile) * variabler Länge (Spalte)
Vorsichtsmaßnahmen bei der Verwendung von Mockito.anyString als Argument beim Verspotten mit Mockito
Java-Lernnotiz (Erstellen eines Arrays)
[Java] Deklarieren und initialisieren Sie ein Array
Bei der Suche nach mehreren in einem Java-Array
Übergeben Sie Parameter beim Debuggen von vscode java. [Hinweis]
Map ohne Verwendung eines Arrays in Java
Vergleichen Sie Elemente eines Arrays (Java)
[Java] Vorsichtsmaßnahmen beim Vergleichen von Zeichenfolgen mit Zeichenfolgen
Vorsichtsmaßnahmen bei der Migration von VB6.0 auf JAVA
Zusammenfassung der guten Punkte und Vorsichtsmaßnahmen bei der Konvertierung der Java Android-Anwendung in Kotlin