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