Scala和SLF4J ::传递多个参数

时间:2012-08-13 19:02:19

标签: scala slf4j variadic-functions

拥有以下代码:    log.info(“parameters {} and {}”,param1,param2) 编译并在Scala中使用SLF4J

但是如果我想传递更多参数,我需要使用Array:

log.info("parameters {} and {} and {}", Array(param1, param2,param3)) 

它只是用array.toString替换第一个参数,并使其余参数保持未绑定状态。

以下代码

log.info("parameters {} and {} and {}", Array(param1, param2,param3) : _*) 
由于以下原因,

无法编译:

error: overloaded method value info with alternatives:
(org.slf4j.Marker,java.lang.String)Unit <and>
(java.lang.String,java.lang.Throwable)Unit <and>
(java.lang.String,Array[java.lang.Object])Unit <and>
(java.lang.String,Any)Unit
cannot be applied to (java.lang.String, Any)
log.info("parameters {} and {} and {}", Array(param1, param2,param3) : _*) 

我在这里缺少什么?

5 个答案:

答案 0 :(得分:4)

我猜这一切都取决于推断的类型。采用数组的log.info方法需要一个Array [AnyRef]。所以作为演员的另一种选择,你可以做到

log.info("parameters {} and {} and {}", Array[AnyRef](1, 2, "a"): _*)

但这不起作用,因为对Int - &gt;之间的隐式转换有限制。 AnyRef。对于那些,你需要一个类型归属:

log.info("parameters {} and {} and {}", 
   Array[AnyRef](1: Integer, 2: Integer, "a"): _*)

有关详细信息,请参阅此问题:Result type of an implicit conversion must be more specific than AnyRef

答案 1 :(得分:2)

你应该像grizzled

那样使用slf4j的scala包装器

如果你不受slf4j的约束,你应该查看Logula。我最近一直在玩这个,我喜欢它。

答案 2 :(得分:0)

如果使用字符串插值怎么办?像这样:

log.info(f"parameters ${param1} and ${param2} and ${param3}")

答案 3 :(得分:-1)

试试这个:

Array(...).asInstanceOf[Array[Object]]

答案 4 :(得分:-1)

我是这样做的。

LOGGER.info(&#34; encode:{},代码:{},length:{}&#34;,Array(messageWrapper,methodCode,bytes.length).asInstanceOf [Array [AnyRef]])< / p>

干杯