| Even though varargs methods are different than methods with an array parameter | |
| as the last parameter, varargs methods are compiled into bytecode as methods | |
| with an array as the last parameter. When a varargs method is _called_, the Java | |
| compiler will insert instructions to automatically box the varargs arguments | |
| into an array. | |
| This detail means that, for example, you can't declare two methods in the same | |
| class where the final parameter is an array in one method, and a varargs of the | |
| same type in the other: | |
| ```java | |
| class Foo { | |
| void bah(double a, double... others) {} | |
| void bah(double baz, double[] myArray) {} // ERROR: bah(double, double[]) already defined | |
| } | |
| ``` | |
| This also means that one method with varargs can override another method with an | |
| array as the final parameter: | |
| ```java | |
| class A { | |
| void something(int... ints) {} | |
| } | |
| class B extends A { | |
| @Override | |
| void something(int[] ints) {} | |
| } | |
| ``` | |
| This overriding may be unintentional (since the signatures 'look' different, the | |
| programmer may be unaware that an overriding has occurred). | |
| Even if this overriding is intentional, it causes inconsistencies at call-sites, | |
| as the code required to invoke the overridden method depends on the static type | |
| of the variable being operated on. | |
| Given the example classes above, observe the result on the client side: | |
| ```java | |
| class Client { | |
| public static void main(String[] args) { | |
| B b = new B(); | |
| A a = b; | |
| a.something(new int[]{1}); // OK, array invocation of varargs method | |
| b.something(new int[]{1}); // OK, direct array invocation | |
| a.something(2); // OK, varargs invocation with 1 element | |
| // Very strange compile-time error: | |
| // error: A.something(int...) is defined in an inaccessible class or interface | |
| b.something(1); | |
| } | |
| } | |
| ``` | |
| To avoid these ambiguities, use the same parameter style (varargs or explicit | |
| arrays) when overriding methods. |