Transforming Scala varargs into Java Object… varargs

前端 未结 2 1464
野的像风
野的像风 2020-12-09 10:55

I have a Java class that logs stuff which has a method like this:

void info(Object message, Object... params);

In Scala, I\'ve created a wr

相关标签:
2条回答
  • 2020-12-09 11:33

    @Galder - there is an easier way which allows you to avoid the cumbersome asInstanceOf[Object] call:

    def info(msg: => String, params: Any*) =  log.info( msg.format(params : _*) );
    

    In scala 2.7, the format(args : Any*) function is implicitly included via RichString (and has a sub-optimal implementation is terms of reflection for no good reason that I can see) whereas in 2.8 the method is included via StringLike and is implemented via a direct call to String.format(String, Object ...)

    I understand that the reason why Java does not contain such a method is that it has an implication that "every String is a format String", which is not the case. happily, I'm willing to forgo the logical correctness for the more useable class which scala provides!

    0 讨论(0)
  • 2020-12-09 11:35

    Found the answer:

    log.info(msg,  params.map(_.asInstanceOf[AnyRef]) : _*)
    

    The following returns a Seq[AnyRef] => params.map(_.asInstanceOf[AnyRef]), and the ': _*' part tells the compiler to pass it as varargs

    Result:

    "Started on 127.0.0.1:1234"
    

    Besides, this solution deals with both AnyVals and AnyRefs

    0 讨论(0)
提交回复
热议问题