2016-06-01 58 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個參數或類型轉換。事實上,有兩種與公司相匹配的重載方法,這兩種方法都是在那裏展示的。因此,如果您需要將任意數量的物品放入其中,但所有物品都會按照您的預期工作。在這種特殊情況下,有兩個對象,您可以執行下列操作之一:

  1. 插入第三個參數,從而使第二事務所((x$1: String, x$2: Object*)Unit)匹配,就像你說(第三個參數將被忽略)。
  2. 鑄兩個參數Any,在這樣的第一家公司將被匹配(通過鍵入LOGGER.warn("something {}, something {}", v1:Any, v2:Any)