如何从Scala调用重载的Java varargs方法?

时间:2014-11-21 16:41:05

标签: scala

我试图用varargs和非varargs版本调用多态方法,

var logger = org.slf4j.LoggerFactory.getLogger("foo")  // 1
logger.warn.("{}{}{}", 1, 2, 3)                        // 2
logger.warn.("{}{}{}", Array(1, 2, 3): _*)             // 3
logger.warn.("{}{}{}", Array(1, 2, 3))                 // 4

第2行不编译,给出“重载方法值警告备选方案”错误。 第3行没有编译,给出了“不':_ *'这里允许的注释”错误。 第4行编译但在运行时调用错误的方法,当我需要调用Logger.warn(String,Object)时,它会调用Logger.warn(String,Object...)

如何从Scala调用正确的方法?

比较这个Java代码

logger.warn("{}-{}-{}", new Integer[] {1, 2, 3});
// produces 1-2-3

使用此Scala

logger.warn("{}-{}-{}", Array(1, 2, 3))
// produces [1, 2, 3]-{}-{}

1 个答案:

答案 0 :(得分:2)

Logger.warn(String,Object...)在后​​端由编译器实现为Logger.warn(String,Object[])。 Java编译器执行转换,允许在JVM中向后兼容。

在Scala中,我想你必须通过传入一个数组来调用该方法。 Array(1, 2, 3)是否在Java中生成与Integer[] = {1, 2, 3}相同的输出?

其他信息:

This article提到您必须在某些情况下转换Scala数组。在文章的底部,您将看到讨论。

您可能必须Array(1, 2, 3).asInstanceOf[Array[Integer]]中显示{{1}}。