2013-12-04 2 views
0

Я читаю о методах, которые включают в VAR-Arg параметры ...Java вар-арг проводной behavoir на расширение

это не законно заявить следующее (как вар-Arg неявно передается как массив т.е. будет метод дубликат)

void m1(int... i) {} 
void m1(int[] i) {} 

но протекающее законно заявить:

void m1(int... i) {} 
void m1(Integer... i) {} 

однако, эти методы могут быть только юридически вызываются с массивами одних и тех же типовнравится:

m1(new Integer[]{}); 
m1(new int[]{}); 

и не с:

m1(2, 3);       //Compile ERR: The method m1(int[]) is ambiguous     
m1(new Integer(2), new Integer(3)); //Compile ERR: The method m1(int[]) is ambiguous 

ещеvoid m1(int... i){} вызывается при вызове с:

m1((byte)1,(short)2);  
m1(new Byte((byte)1), new Byte((byte)1)); 

//Both compile fine and the method 
//void m1(int... i) {} is invoked 

Мой вопрос является, если (byte)1,(short)2 или new Byte((byte)1), new Byte((byte)1) передаются как int[]

почему он не ведет себя то же самое для m1(2, 3) или m1(new Integer(2), new Integer(3));?

ответ

1

, как вы читаете, вы можете быть в курсе есть процесс параметр вар-Arg является Родовой процесс параметра во время выполнения и есть некоторые ограничения литья при работе с Generic чтения тех here и для следующего запроса

m1((byte)1,(short)2);//for this it will automatically wrap your digits in non primitive class object read boxing conversation 
m1(new Byte((byte)1), new Byte((byte)1));//for this it is working as you are creating non primitive objects 

Boxing Conversation

+0

'm1 (new Integer (3), new Integer (4));' дает ошибку компиляции 'Метод m1 (int []) неоднозначен "или" Метод m1 (Integer []) неоднозначен "в зависимости от порядок объявления m1 (int ...) и m1 (Integer ...) – DayaMoon

+0

Thx VD, я посмотрю – DayaMoon

0

Byte не распространяется Integer. Поэтому было бы неверно называть метод void m1(Integer i) {}, выполнив m1(new Byte(1)) (с или без varargs).

Он работает с int и byte потому byte можно ссылаться как int.

+0

Я запустил его до принятия m1 ((byte) 1, (byte) 2) int ... CALLED m1 (новый байт ((байт) 1), новый байт ((байт) 1)) int ... CALLED – DayaMoon

1

Помните Widening ударов бокса бьет Var-Args

(байт) 1, (короткий) 2 не может быть расширен до Int, Int, а затем Integer, Integer (Виден Тогда Box) - Дорогостоящие или тяжелый для виртуальной машины Java. short и byte можно легко расширить до int так int ....

новый байт ((байт) 1), новый байт ((байт) 1) не может быть typecast для (Integer, Integer), то есть Unbox to byte, затем расширять до int и снова поле Integer (Widen then Box) Толстая. Но его можно легко распаковать в байты и расширить до int (Box Then Widen не тяжелый), поэтому int ... вызывается.

В вышеупомянутых двух случаях будет вызываться int [].

m1 (2, 3) может быть помещен в целое число [] или передан в int [] - Ambiguity m1 (новое целое число (2), новое целое число (3)) может быть передано в Integer [] или unboxed to внутр.

Смежные вопросы