2014-11-21 146 views
2

我试图打电话与两个可变参数和非可变参数版本的多态方法,如何从Scala调用Java重载可变参数方法?

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 

有了这个斯卡拉

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

回答

2

Logger.warn(String,Object...)在编译器为Logger.warn(String,Object[])后端实现。 Java编译器执行转换,允许在JVM中向后兼容。我想你将不得不通过传递数组来调用方法。在Java中,Array(1, 2, 3)Integer[] = {1, 2, 3}的输出结果是否相同?

附加信息:

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

您可能需要做Array(1, 2, 3).asInstanceOf[Array[Integer]],如this forum post所示。

+0

不,Java版本没有错,但Scala版本没有。 – 2014-11-21 17:02:24

+0

@IanPhillips我在回答中添加了一些额外的信息。它有帮助吗? – markbernard 2014-11-25 16:32:10

+2

这篇文章似乎并不正确,但是它指出了我正确的方向,所以是的,它有帮助!你必须像你所描述的那样转换数组(尽管Array [Object]是实际代码,因为它是异构的),然后在末尾加上':_ *'来扩展它。 – 2014-11-27 09:22:50

相关问题