我有一个Java类,它记录的东西有这样的方法:
void info(Object message, Object... params);
在Scala中,我创建了一个这样的调用包装器,如下所示:
def info(msg: => String, params: Any*) {
log.info(msg, params);
}
我打电话的时候:
val host = "127.0.0.1"
val port = "1234"
info("Start on {0}:{1}", host, port)
我明白了:
"Started on WrappedArray(127.0.0.1, 1234):{1}"
现在,有没有人如何将params转换为可以正确使用的Object []?
我试着这样做:
def info(msg: => String, params: Any*)
log.info(msg, params.toList.toArray);
}
但这不起作用:
"Started on [Ljava.lang.Object;@14a18d:{1}"
当你这样做时会发生类似的事情:
params.asInstanceOf[WrappedArray[Object]].array
答案 0 :(得分:19)
找到答案:
log.info(msg, params.map(_.asInstanceOf[AnyRef]) : _*)
以下返回Seq [AnyRef] => params.map(_。asInstanceOf [AnyRef]),':_ *'部分告诉编译器将其作为varargs传递
结果:
"Started on 127.0.0.1:1234"
此外,此解决方案同时处理AnyVals和AnyRefs
答案 1 :(得分:12)
@Galder - 有一种更简单的方法可以避免繁琐的asInstanceOf[Object]
电话:
def info(msg: => String, params: Any*) = log.info( msg.format(params : _*) );
在scala 2.7中,format(args : Any*)
函数通过RichString
隐式包含(并且具有次优实现是反射条件,没有任何理由我可以看到)而在2.8中,该方法是已包含在StringLike
内,可通过直接致电String.format(String, Object ...)
据我所知,Java不包含这种方法的原因是它有一个暗示“每个String都是一个格式字符串”,但实际情况并非如此。幸运的是,我愿意放弃scala提供的更有用的类的逻辑正确性!