Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决scala中不明确的方法引用_Scala_Slf4j - Fatal编程技术网

如何解决scala中不明确的方法引用

如何解决scala中不明确的方法引用,scala,slf4j,Scala,Slf4j,以下是我遇到的具体问题。我正在使用(变量的类型记录器如下) 下面是eclipse中鼠标悬停(和编译器)告诉我的内容 对重载定义的引用不明确,类型为(x$1:String,x$2:Object*)单元的trait Logger中的方法调试和类型为(x$1:String,x$2:Any,x$3:Any)单元的trait Logger中的方法调试都匹配参数类型(String,String,String) 我理解它们为何含糊不清。我当然不会与编译器争论:)。我只想知道经验丰富的程序员是如何解决这个问题的

以下是我遇到的具体问题。我正在使用(变量的类型<代码>记录器如下)

下面是eclipse中鼠标悬停(和编译器)告诉我的内容

对重载定义的引用不明确,类型为(x$1:String,x$2:Object*)单元的trait Logger中的方法调试和类型为(x$1:String,x$2:Any,x$3:Any)单元的trait Logger中的方法调试都匹配参数类型(String,String,String)

我理解它们为何含糊不清。我当然不会与编译器争论:)。我只想知道经验丰富的程序员是如何解决这个问题的。

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

  • 创建和排列,并使用
    对象*
    定义

    logger调试(“添加{}={}”,数组(键,值):*)

  • 强制转换到
    Any

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

  • 这两种方法都不是特别有吸引力。社区对我有更好的方法或建议吗

    非常感谢

    我会用

    logger.debug("Adding {} = {}", key, value: Any)
    
    或者,可以使用以下方法:

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

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

    首先向@Shadowlands、@ArneClaassen和@OlgeRudenko致敬。 正如评论中提到的,这似乎是一个众所周知的问题。这阻止了我试图“解决”它。下一步要做的是找到一个不破坏Scala习惯用法的好方法

    考虑到这些限制,我选择了上面建议的字符串插值。我也换了。引用他们的GitHub/README

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

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

    它的性能很好,因为得益于Scala宏,启用了检查的习惯用法得以应用,就像编写更复杂的代码一样:

    if(logger.isDebugEnabled)logger.debug(s“Some$priced message!”)

    谢谢大家!就我而言,这个问题已经解决了。如果评论员们能够发表他们的答案,我将很高兴向他们表示感谢

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

    PS:我刚刚验证了,如果使用scala日志记录,字符串插值不会产生执行成本。我的验证方法粗糙但有效

        log.debug{ 
            {
              throw new IllegalAccessException("This should not have been called with debug off!")
            }
            s"Added Header ${name}:${headerValue}"
          }
    
    果不其然,当我将日志设置为DEBUG时,异常会按预期抛出,但当我将其设置为更高级别时,异常会消失。
    是的,我已经删除了
    IllegalAccessException
    part:)。

    看起来这可能是一个已知的问题-我想就是这个问题。谢谢你的帮助@Shadowlands!如果你可以把它作为一个答案,我可以标记问题的解决,我们可以帮助社区。对于字符串插值,我总是使用
    logger debug(s“Adding$key=$value)
    这些数据。因为字符串插值是编译时的,所以它可能更有效well@ArneClaassen对不起,我的无知。但问题是什么“在您的代码中?Scala 2.10添加了字符串插值。这里解释了“s”和其他类似的词:是的,@OlegRudenko你指出错误是正确的。我打得不好。我猜当我写Object*的时候,我一定是在心里勾掉了*。不管怎样,一个错误就是一个错误。谢谢你纠正它。我将纠正我原来的问题。似乎第一种方法比第二种方法更可取,第二种方法创建一个数组,即使日志级别被禁用。也许在检查是否启用调试时包装该版本?请使用scala日志记录:这些答案只是为了说明如何解决不明确的方法引用。关于性能:我的经验表明,只有当您真正看到需要时,才应该关注代码的可读性并优化性能。谢谢!我忘了提。我已切换到scala日志记录。除非debug为true,否则调试语句不会产生执行成本。
        log.debug{ 
            {
              throw new IllegalAccessException("This should not have been called with debug off!")
            }
            s"Added Header ${name}:${headerValue}"
          }