2014-11-21 70 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

相關問題