如何使用一系列参数调用"vararg"方法?

yeg*_*256 6 java variadic-functions

我正打算打电话String.format()StringObject[].我该怎么做?

Rom*_*las 14

就像那样:

String.format(myString, myArray);
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 12

你应该可以打电话

String text = String.format(formatString, args);
Run Code Online (Sandbox Code Playgroud)

...假设您希望args成为多个值.如果你需要额外的包装,你必须自己做:

String text = String.format(formatString, new Object[] { args });
Run Code Online (Sandbox Code Playgroud)

基本上,如果参数类型已经与参数数组类型匹配,则编译器不会执行任何包装.

从JLS,第15.12.4.2节:

如果使用kn实际参数表达式调用m,或者,如果使用k = n实际参数表达式调用m并且第k个参数表达式的类型与T []不匹配,则参数列表(e1,...) ...,en-1,en,... ek)被评估为好像它被写为(e1,...,en-1,new T [] {en,...,ek}).

注意开头的"If" - 这就是有效地说,如果参数已经没问题,则不执行包装.


And*_*ich 6

在由例如短:(S2I2是可能的最有趣的版本通过所述可变参数作为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    ) ;
Run Code Online (Sandbox Code Playgroud)

输出:

## 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
Run Code Online (Sandbox Code Playgroud)