2012-06-06 112 views
2

試圖寫一個封裝到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

請參閱[http://stackoverflow.com/questions/4325086/why-is-scalas-behavior-in-case-of-overloading-with-by-name-parameters-different][1]中的說明 [1]:http://stackoverflow.com/questions/4325086/why-is-scalas-behavior-in-case-of-overloading-with-by-name-parameters-different –

回答

1

Array[_]AnyRef的子類型,因此任何使用類型爲Array[AnyRef]的第二個參數的調用都適用於這兩種方法。

沒有按名稱參數,你可以很容易地解決這個利用可變參數:

def logWarn(message: => String, args: AnyRef*) { 
    if (logger.isWarnEnabled) { 
    logger.warn(message, args) 
    } 
} 

但是通過名字PARAMS不可變參數兼容(在2.9.1至少)。這意味着args: (=> AnyRef)*無效。