我试图用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]-{}-{}
答案 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}}。