Как вызвать метод "vararg" с массивом параметров? - PullRequest
6 голосов
/ 05 ноября 2010

Я пытаюсь позвонить String.format() с String и Object[]. Как я могу это сделать?

Ответы [ 3 ]

14 голосов
/ 05 ноября 2010

Просто так:

String.format(myString, myArray);
12 голосов
/ 05 ноября 2010

Вы должны просто быть в состоянии позвонить

String text = String.format(formatString, args);

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

String text = String.format(formatString, new Object[] { args });

Как правило, если тип аргумента уже соответствует типу массива параметров, компилятор не выполняет перенос.

из JLS, раздел 15.12.4.2 :

Если m вызывается с действительными выражениями аргумента kn или если m вызывается с действительными выражениями аргумента k = n, а тип k-го выражения аргумента не совместим с T [], то список аргументов ( e1, ..., en-1, en, ... ek) оценивается так, как если бы оно было записано как (e1, ..., en-1, new T [] {en, ..., ek}) .

Обратите внимание на «Если» в начале - это то, что фактически говорит о том, что если аргумент уже в порядке, перенос не выполняется.

6 голосов
/ 12 ноября 2015

вкратце по примеру: ( S2 и I2 , вероятно, являются наиболее интересными версиями , передавая varargs как Object[])

PrintStream ps    = System.out ;

String[]    sarr  = new String[] { "a" , "b" } ;
Object      os    = sarr ;

int[]       iarr  = new int[]     { 1 , 2 } ;  // cannot be cast to Object[] - see I6 below
Integer[]   ioarr = new Integer[] { 1 , 2 } ;  // can    be cast to Object[] - see I2 below
Object      oi    = iarr ;                     // cannot be cast to Object[] - see I6 below

ps.printf( "%n## Strings:%n%n" ) ;

ps.printf( "S1: pass as single objects:            %s, %s%n" ,            "a"  , "b" ) ;
ps.printf( "S2: pass as varargs objects:           %s, %s%n" , (Object[]) sarr       ) ;
ps.printf( "S3: pass as single objects:            %s, %s%n" ,            sarr , "c" ) ;
ps.printf( "S4: pass as single objects:            %s, %s%n" ,            os   , "c" ) ;
// ps.printf( "S5: MissingFormatArgumentException: %s, %s%n" ,            os   ) ;
// ps.printf( "S6: ClassCastException:             %s, %s%n" , (Object[]) os   ) ;

ps.printf( "%n## int:%n%n" ) ;

ps.printf( "I1: pass as single objects:            %s, %s%n" ,            1     , 2 ) ;
ps.printf( "I2: pass as varargs objects:           %s, %s%n" , (Object[]) ioarr ) ;
ps.printf( "I3: pass as single objects:            %s, %s%n" ,            iarr  , 3 ) ;
ps.printf( "I4: pass as single objects:            %s, %s%n" ,            oi    , 3 ) ;
// ps.printf( "I5: MissingFormatArgumentException  %s, %s%n" ,            iarr  ) ;
// ps.printf( "I6: ClassCastException:             %s, %s%n" , (Object[]) oi    ) ;

выходы:

## Strings:

S1: pass as single objects:                a, b
S2: pass as varargs objects:               a, b
S3: pass as single objects:                [Ljava.lang.String;@ad02649, c
S4: pass as single objects:                [Ljava.lang.String;@ad02649, c

## int:

I1: pass as single objects:                1, 2
I2: pass as varargs objects:               1, 2
I3: pass as single objects:                [I@6781882a, 3
I4: pass as single objects:                [I@6781882a, 3
...