Scala和SLF4J ::传递多个参数

jde*_*lop 6 scala variadic-functions slf4j

拥有以下代码:log.info("parameters {}和{}",param1,param2)在Scala中编译并与SLF4J一起使用

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

log.info("parameters {} and {} and {}", Array(param1, param2,param3)) 
Run Code Online (Sandbox Code Playgroud)

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

以下代码

log.info("parameters {} and {} and {}", Array(param1, param2,param3) : _*) 
Run Code Online (Sandbox Code Playgroud)

不编译,因为:

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) : _*) 
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

Bru*_*eth 5

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

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

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

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

有关更多详细信息,请参阅此问题:隐式转换的结果类型必须比 AnyRef 更具体


Fal*_*rri 2

你应该使用 slf4j 的 scala 包装器,比如grizzled

如果您没有绑定 slf4j,您应该查看Logula。我最近一直在玩这个,我很喜欢它。

  • 每个项目依赖都是未来额外的维护工作。例如,@Falmarri 在 2012 年提到的“Logula”现在被标记为“废弃” (3认同)