代码之家  ›  专栏  ›  技术社区  ›  yegor256

如何用参数数组调用“vararg”方法?

  •  6
  • yegor256  · 技术社区  · 14 年前

    String.format() 有一个 String Object[] . 我该怎么做?

    3 回复  |  直到 14 年前
        1
  •  14
  •   Romain Linsolas    14 年前

    就这样:

    String.format(myString, myArray);
    
        2
  •  12
  •   Jon Skeet    14 年前

    你应该可以打电话

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

    args 是多重值。如果你需要额外的包装,你必须自己做:

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

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

    从JLS科 15.12.4.2

    如果用k n实参表达式调用m,或者如果用k=n实参表达式调用m,并且第k个实参表达式的类型与T[]不兼容,那么实参列表(e1,…)。。。,en-1,en,….ek)的计算方式与(e1,…,en-1,new T[]{en,…,ek})一样。

        3
  •  6
  •   Andreas Covidiot    9 年前

    简而言之,举个例子: ( 可能是最有趣的版本 这个 瓦拉格斯作为 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