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é.
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?
console
No.1 length = 3
No.2 length = 3
No.3 length = 2
No.4 length = 1
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.
//No.2 length = 1
test(2, (Object) new String[]{"a", "b", "c"});
Recommended Posts