2010-11-05 6 views

ответ

14

Просто так:

String.format(myString, myArray); 
+0

Это не работает для меня для других методов vararg в java 1.8. – IARI

11

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

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

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

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

В принципе, если аргумент типа уже соответствует параметру типа массива, то компилятор не делает какую-либо упаковки.

От JLS, раздел 15.12.4.2:

Если т в настоящее время вызывается с кп фактических выражений аргументов, или, если т в настоящее время вызывается с к = п фактических выражений аргументов и тип выражения KTH аргумента не является присвоением, совместимым с T [], тогда список аргументов (e1, ..., en-1, en, ... ek) оценивается так, как если бы он был написан как (e1, ..., en-1, новый T [] {en, ..., ek}).

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

4

короче на примере: (S2 и I2, вероятно, наиболее интересные варианты прохождениепеременной длины в качестве 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:    [[email protected], 3 
I4: pass as single objects:    [[email protected], 3 
Смежные вопросы