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()));

上記の 2 番目のメソッドを呼び出すつもりであることを 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])   

どうしたの?

4

1 に答える 1

1

Array[_]は のサブタイプでAnyRefあるため、 type の 2 番目の引数を指定した呼び出しは、Array[AnyRef]両方のメソッドに対して有効です。

名前によるパラメーターがなければ、varargs を使用して簡単に回避できます。

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

ただし、名前によるパラメーターは可変引数と互換性がありません (少なくとも 2.9.1 では)。これは、それargs: (=> AnyRef)*が無効であることを意味します。

于 2012-06-06T14:43:13.823 に答える