可変長引数の取り扱い

単純に

scala> def sprintf(fmt:String, args:Any*) = String.format(fmt, args)
sprintf: (String,Any*)java.lang.String

だと

scala> sprintf("%d,%d", 1,2)
java.util.IllegalFormatConversionException: d != scala.runtime.BoxedObjectArray
        at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:3992)
        at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2708)
        at java.util.Formatter$FormatSpecifier.print(Formatter.java:2660)
        at java.util.Formatter.format(Formatter.java:2432)
        at java.util.Formatter.format(Formatt...||<

のように「型が違うと」怒られるので

ちょっと前までは、

  def sprintf(fmt:String, args:Any*):String = String.format(fmt, args.map(e => e.asInstanceOf[AnyRef]).toArray)

とすればよかったが、

いつの間にか、

scala>  def sprintf(fmt:String, args:Any*) = String.format(fmt, args.map(e => e.asInstanceOf[AnyRef]).toArray)
<console>:4: warning: I'm seeing an array passed into a Java vararg.
I assume that the elements of this array should be passed as individual arguments to the vararg.
Therefore I follow the array with a `: _*', to mark it as a vararg argument.
If that's not what you want, compile this file with option -Xno-varargs-conversion.
        def sprintf(fmt:String, args:Any*) = String.format(fmt, args.map(e => e.asInstanceOf[AnyRef]).toArray)

コンパイルは通るけど、)とかいわれるようになったので、
素直に

  def sprintf(fmt:String, args:Any*):String = String.format(fmt, args.map(e => e.asInstanceOf[AnyRef]): _*)

とすると、警告は出なくなる。

「: _*」については、勉強中・・・