7

具有以下代码: 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) : _*) 

我在这里想念什么?

4

5 回答 5

5

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

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

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

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

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

于 2012-08-23T14:39:41.427 回答
2

您应该为 slf4j 使用 scala 包装器,例如grizzled

如果你没有绑定到 slf4j,你应该看看Logula。我最近一直在玩它,我喜欢它。

于 2012-08-13T21:04:04.560 回答
0

如果你使用字符串插值呢?像这样:

log.info(f"parameters ${param1} and ${param2} and ${param3}")
于 2013-08-18T17:34:07.660 回答
-1

Try this:

Array(...).asInstanceOf[Array[Object]]
于 2012-08-13T21:15:51.443 回答
-1

这是我的做法。

LOGGER.info("encode: {}, code: {}, length: {}", Array(messageWrapper, methodCode, bytes.length).asInstanceOf[Array[AnyRef]])

干杯

于 2014-03-25T19:54:20.757 回答