如何解决 Scala 中不明确的方法引用
How to resolve ambiguous method reference in scala
这是我遇到的具体问题。我用的是SLF4J Logger (下面变量的类型logger
)
//After adding to a map
logger debug ("Adding {} = {}", key, value)
这是鼠标悬停在 eclipse(和编译器)中告诉我的内容。
ambiguous reference to overloaded definition, both method debug in trait Logger of type (x: String, x: Object*)Unit and method debug in trait Logger of type (x: String, x: Any, x: Any)Unit match argument types (String,String,String)
我明白他们为什么会模棱两可了。我当然不是在与编译器争论 :)。我想简单地知道经验丰富的程序员是如何解决这个问题的。
以下是我可以使用的替代方法
创建数组,并使用 Object*
定义
logger debug ("Adding {} = {}", Array(key, value):_*)
转换为 Any
logger debug ("Adding {} = {}", key.asInstanceOf[Any], value.asInstanceOf[Any])
这两种方法都不是特别吸引人。社区对我有更好的方法或建议吗?
非常感谢!
我会用
logger.debug("Adding {} = {}", key, value: Any)
也可以使用以下方法:
logger.debug("Adding {} = {}", Array(key, value):_*)
请关注:_*
。如果您省略这些符号,它将调用 Object*
方法,只提供 1 个参数,这将是一个数组。
首先感谢@Shadowlands、@ArneClaassen 和@OlgeRudenko。
如评论中所述,这似乎确实是已知问题。这阻止了我尝试 "solve" 它。下一步要做的是找到一个不破坏 Scala 习惯用法的好方法。
考虑到这些限制,我选择了上面建议的 String Interpolation。我也切换到scala-logging。引用他们的 GitHub/README,
Scala Logging is a convenient and performant logging library wrapping SLF4J. It's convenient, because you can simply call log methods without checking whether the respective log level is enabled:
logger.debug(s"Some $expensive message!")
It's performant, because thanks to Scala macros the check-enabled-idiom is applied, just like writing this more involved code:
if (logger.isDebugEnabled) logger.debug(s"Some $expensive message!")
谢谢大家!就我而言,这已经解决了。如果评论者可以post回答,我会很高兴地向他们致谢。
一如既往,站在友善巨人的肩膀上感觉真好!
PS: 我刚刚验证了字符串插值没有执行成本如果您使用的是 scala-logging .我的验证方法很粗糙但是很有效
log.debug{
{
throw new IllegalAccessException("This should not have been called with debug off!")
}
s"Added Header ${name}:${headerValue}"
}
果然,当我将我的日志设置为 DEBUG
时,异常被抛出, 正如预期的那样 ,但是当我将其设置为更高级别时异常消失了。
是的,我已经删除了 IllegalAccessException
部分 :).
这是我遇到的具体问题。我用的是SLF4J Logger (下面变量的类型logger
)
//After adding to a map
logger debug ("Adding {} = {}", key, value)
这是鼠标悬停在 eclipse(和编译器)中告诉我的内容。
ambiguous reference to overloaded definition, both method debug in trait Logger of type (x: String, x: Object*)Unit and method debug in trait Logger of type (x: String, x: Any, x: Any)Unit match argument types (String,String,String)
我明白他们为什么会模棱两可了。我当然不是在与编译器争论 :)。我想简单地知道经验丰富的程序员是如何解决这个问题的。
以下是我可以使用的替代方法
创建数组,并使用
Object*
定义logger debug ("Adding {} = {}", Array(key, value):_*)
转换为
Any
logger debug ("Adding {} = {}", key.asInstanceOf[Any], value.asInstanceOf[Any])
这两种方法都不是特别吸引人。社区对我有更好的方法或建议吗?
非常感谢!
我会用
logger.debug("Adding {} = {}", key, value: Any)
也可以使用以下方法:
logger.debug("Adding {} = {}", Array(key, value):_*)
请关注:_*
。如果您省略这些符号,它将调用 Object*
方法,只提供 1 个参数,这将是一个数组。
首先感谢@Shadowlands、@ArneClaassen 和@OlgeRudenko。 如评论中所述,这似乎确实是已知问题。这阻止了我尝试 "solve" 它。下一步要做的是找到一个不破坏 Scala 习惯用法的好方法。
考虑到这些限制,我选择了上面建议的 String Interpolation。我也切换到scala-logging。引用他们的 GitHub/README,
Scala Logging is a convenient and performant logging library wrapping SLF4J. It's convenient, because you can simply call log methods without checking whether the respective log level is enabled:
logger.debug(s"Some $expensive message!")
It's performant, because thanks to Scala macros the check-enabled-idiom is applied, just like writing this more involved code:
if (logger.isDebugEnabled) logger.debug(s"Some $expensive message!")
谢谢大家!就我而言,这已经解决了。如果评论者可以post回答,我会很高兴地向他们致谢。
一如既往,站在友善巨人的肩膀上感觉真好!
PS: 我刚刚验证了字符串插值没有执行成本如果您使用的是 scala-logging .我的验证方法很粗糙但是很有效
log.debug{
{
throw new IllegalAccessException("This should not have been called with debug off!")
}
s"Added Header ${name}:${headerValue}"
}
果然,当我将我的日志设置为 DEBUG
时,异常被抛出, 正如预期的那样 ,但是当我将其设置为更高级别时异常消失了。
是的,我已经删除了 IllegalAccessException
部分 :).