如何解决scala中的模糊方法引用

时间:2015-09-02 21:27:35

标签: scala slf4j

以下是我遇到的具体问题。我正在使用SLF4J Logger (下面变量logger的类型)

//After adding to a map
logger debug ("Adding {} = {}", key, value)

这是eclipse(和编译器)中的鼠标悬停告诉我的。

  

对重载定义的模糊引用,两种方法调试特性记录器类型为(x $ 1:String,x $ 2:Object *)单元和方法调试特性记录器类型(x $ 1:字符串,x $ 2:任意,x $ 3:Any)单位匹配参数类型(String,String,String)

我明白为什么他们含糊不清。我当然不是在和编译器争论:)。我想简单地了解经验丰富的程序员如何解决这个问题。

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

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

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

  2. 转换为Any

    logger debug ("Adding {} = {}", key.asInstanceOf[Any], value.asInstanceOf[Any])

  3. 这两种方法都没有特别吸引人。社区对我有更好的方法或建议吗?

    非常感谢!

2 个答案:

答案 0 :(得分:8)

我会用

logger.debug("Adding {} = {}", key, value: Any)

或者可以使用以下内容:

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

请注意:_*。如果省略这些符号,它将调用仅提供1个参数的Object*方法,该参数将是一个数组。

答案 1 :(得分:6)

首先获得@Shadowlands,@ ArneClaassen和@OlgeRudenko的信任。 正如评论中所提到的,这似乎是已知问题。这阻止了我试图“解决”它。接下来要做的是找到一个没有破坏Scala成语的好工作。

考虑到这些限制因素,我选择使用 String Interpolation ,如上所述。我也切换到了scala-logging。引自他们的GitHub / README,

  

Scala Logging是一个包装SLF4J的方便且高效的日志记录库。这很方便,因为您可以简单地调用日志方法而无需检查是否启用了相应的日志级别:

     

logger.debug(s“一些昂贵的消息!”)

     

这是高效的,因为感谢Scala宏,应用了check-enabled-idiom,就像编写这个更复杂的代码一样:

     

if(logger.isDebugEnabled)logger.debug(s“一些昂贵的消息!”)

谢谢大家!就我而言,这已得到解决。如果评论员可以发表他们的答案,我将很乐意承认他们。

一如既往,站在友好巨人的肩膀上感觉很好!

PS:我刚刚确认,如果您使用的是scala-logging ,则字符串插值没有执行成本。我的验证方法粗糙但有效。

    log.debug{ 
        {
          throw new IllegalAccessException("This should not have been called with debug off!")
        }
        s"Added Header ${name}:${headerValue}"
      }

果然,当我将日志设置为DEBUG时,会抛出异常,按预期,但当我将其设置为更高级别时会消失。 是的,我已经删除了IllegalAccessException部分:)。