如何解决 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)

我明白他们为什么会模棱两可了。我当然不是在与编译器争论 :)。我想简单地知道经验丰富的程序员是如何解决这个问题的。

以下是我可以使用的替代方法

  1. 创建数组,并使用 Object* 定义

    logger debug ("Adding {} = {}", Array(key, value):_*)

  2. 转换为 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 部分 :).