Scala中的模糊重载

时间:2012-06-06 14:09:10

标签: scala slf4j

尝试为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])   

发生了什么事?

1 个答案:

答案 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)*无效。