尝试为slf4j写一个包装器。
编写方法。其中2个是:
def logWarn(message: => String, arg1: => AnyRef) = {
if (logger.isWarnEnabled) {
logger.warn(message, arg1)
}
}
def logWarn(message: => String, args: => Array[AnyRef]) = {
if (logger.isWarnEnabled) {
logger.warn(message, args)
}
}
这很好地编译。问题是试图调用:
logWarn("retried: {}. Error is: {}", Array[AnyRef](numOfRetries.toString(), e.toString()));
我希望Scala知道我的意思是调用上面的第二种方法。由于某些原因,我收到了这个错误:
ambiguous reference to overloaded definition, both method logWarn in trait Slf4jLogger of type
(message: => String, args: => Array[AnyRef])Unit
and method logWarn in trait Slf4jLogger of type (message: => String, arg1: => AnyRef)Unit
match argument types (java.lang.String,Array[AnyRef])
发生了什么事?
答案 0 :(得分:1)
Array[_]
是AnyRef
的子类型,因此任何类型为Array[AnyRef]
的第二个参数的调用对两种方法都有效。
如果没有按名称参数,您可以使用varargs轻松解决此问题:
def logWarn(message: => String, args: AnyRef*) {
if (logger.isWarnEnabled) {
logger.warn(message, args)
}
}
然而,名称参数与varargs不兼容(至少在2.9.1中)。这意味着args: (=> AnyRef)*
无效。