将 Scala varargs 转换为 Java Object... varargs [英] Transforming Scala varargs into Java Object... varargs

查看:36
本文介绍了将 Scala varargs 转换为 Java Object... varargs的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 Java 类,用于记录具有如下方法的内容:

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

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

在 Scala 中,我围绕这样的调用创建了一个包装器,如下所示:

In Scala, I've created a wrapper around such call that looks like this:

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[] 吗?

Now, does anyone now how to convert params into an Object[] that can be consumed properly?

我尝试这样做:

def info(msg: => String, params: Any*)
  log.info(msg, params.toList.toArray);
}

但这不起作用:

"Started on [Ljava.lang.Object;@14a18d:{1}"

当你这样做时会发生类似的事情:

Similar thing happens when you do:

params.asInstanceOf[WrappedArray[Object]].array

推荐答案

找到答案:

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

以下返回一个 Seq[AnyRef] => 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

结果:

"Started on 127.0.0.1:1234"

此外,该解决方案同时处理 AnyVals 和 AnyRefs

Besides, this solution deals with both AnyVals and AnyRefs

这篇关于将 Scala varargs 转换为 Java Object... varargs的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆