2016-06-01 3 views
1
./spark-shell 

scala> import org.slf4j.{Logger, LoggerFactory} 
import org.slf4j.{Logger, LoggerFactory} 

scala> val LOGGER = LoggerFactory.getLogger("testing") 
LOGGER: org.slf4j.Logger = org.slf4j.impl.Log4jLoggerAdapter(testing) 

scala> val v1 = "1" 
v1: String = 1 

scala> val v2 = "2" 
v2: String = 2 

これは私が期待どおりに動作しません:log4jのパラメータ化された置換は空の文字列を必要としますか?

scala> LOGGER.warn("something {}, something {}", v1, v2) 
<console>:30: error: ambiguous reference to overloaded definition, 
both method warn in trait Logger of type (x$1: String, x$2: Any, x$3: Any)Unit 
and method warn in trait Logger of type (x$1: String, x$2: Object*)Unit 
match argument types (String,String,String) 
     LOGGER.warn("something {}, something {}", v1, v2) 
      ^

しかし、この処理が行われます。

scala> LOGGER.warn("something {}, something {}", v1, v2, "") 
16/05/30 10:16:59 WARN testing: something 1, something 2 

は、私がここでやっている何か問題はありますか?

答えて

0

実際には空の文字列は必要ありませんが、少なくとも3つの引数または型キャストが必要です。実際には、企業に合った2つのオーバーロードされた方法があり、そこに示されている2つの方法があります。したがって、2つのアイテムをいくつでも置く必要がある場合は、2つすべてが期待どおりに機能します。あなたは(3番目の引数が無視されると述べてきたように第二事務所((x$1: String, x$2: Object*)Unit)が、一致するように、第三引数を挿入

  1. :この特定のケースでは、二つのオブジェクトでは、次のいずれかを行うことができます)。
LOGGER.warn("something {}, something {}", v1:Any, v2:Any)を入力して)、このように最初の会社が照合されます、 Anyに二つの引数をキャスト
関連する問題