[Java] Précautions lors de la conversion de paramètres d'argument de longueur variable dans un tableau

Je pense que si vous ne faites pas attention lorsque vous jouez avec la réflexion ou la désencapsulation de J Mockit, ce sera un très bon point, alors je l'ai résumé.

Déplacez-vous avec différents modèles pour le moment

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);

    }

}

Les valeurs sont transmises aux paramètres d'argument de longueur variable dans divers modèles et la taille du paramètre reçu est sortie. Comment sera-t-il sorti sur la console?

Résultat de sortie

console


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

Commentaire

Il est facile de comprendre si vous savez que la définition d'arguments de longueur variable est en fait un tableau et que vous pensez à ce à quoi il ressemblera au moment de la compilation.

Le destinataire est converti en une méthode avec les arguments suivants au moment de la compilation.

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

No.1

Converti en tableau récepteur au moment de la compilation.

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

La taille sera de 3.

No.2

Aucune conversion n'est effectuée car le tableau est déjà covariant.

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

La taille sera de 3.

No.3

Converti en tableau récepteur au moment de la compilation.

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

La taille sera de 2.

No.4

Bien qu'il s'agisse déjà d'un tableau, le tableau de type primitif ne peut pas être converti en tableau Object tel quel, il est donc converti dans l'état encapsulé dans le tableau Object au moment de la compilation.

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

La taille sera 1.

Épilogue

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

Recommended Posts

[Java] Précautions lors de la conversion de paramètres d'argument de longueur variable dans un tableau
[Java] Copie superficielle et copie complète lors de la conversion d'un tableau en liste
<Java> Lors de la création d'un tableau bidimensionnel de longueur fixe (ligne) * longueur variable (colonne)
Précautions lors de l'utilisation de Mockito.anyString comme argument lors de Mocking avec Mockito
Mémo d'apprentissage Java (création d'un tableau)
[Java] Déclarer et initialiser un tableau
Lors de la recherche de plusieurs dans un tableau Java
Passez les paramètres lors du débogage de vscode java. [Remarque]
Mapper sans utiliser de tableau en java
Comparer les éléments d'un tableau (Java)
[Java] Précautions lors de la comparaison de chaînes de caractères avec des chaînes de caractères
Précautions lors de la migration de VB6.0 vers JAVA
Résumé des bons points et des précautions lors de la conversion de l'application Java Android vers Kotlin