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