7

次のコードを持つ: log.info("parameters {} and {}", param1, param2) はコンパイルされ、Scala の SLF4J でうまく動作します

ただし、より多くの引数を渡したい場合は、Array を使用する必要があります。

log.info("parameters {} and {} and {}", Array(param1, param2,param3)) 

これは単に最初のパラメーターを array.toString に置き換え、残りのパラメーターをバインドしないままにします。

次のコード

log.info("parameters {} and {} and {}", Array(param1, param2,param3) : _*) 

次の理由により、コンパイルされません。

error: overloaded method value info with alternatives:
(org.slf4j.Marker,java.lang.String)Unit <and>
(java.lang.String,java.lang.Throwable)Unit <and>
(java.lang.String,Array[java.lang.Object])Unit <and>
(java.lang.String,Any)Unit
cannot be applied to (java.lang.String, Any)
log.info("parameters {} and {} and {}", Array(param1, param2,param3) : _*) 

ここで何が欠けていますか?

4

5 に答える 5

5

私はそれがすべて推論された型に依存していると思います。配列を取る log.info メソッドは、Array[AnyRef] を想定しています。だからあなたができるキャストの代わりとして

log.info("parameters {} and {} and {}", Array[AnyRef](1, 2, "a"): _*)

ただし、Int -> AnyRef 間の暗黙的な変換には制限があるため、これは機能しません。それらについては、タイプの割り当てが必要です。

log.info("parameters {} and {} and {}", 
   Array[AnyRef](1: Integer, 2: Integer, "a"): _*)

詳細については、この質問を参照してください:暗黙的な変換の結果の型は AnyRef よりも具体的でなければなりません

于 2012-08-23T14:39:41.427 に答える
2

grizzledのようなslf4jにはscalaラッパーを使用する必要があります

slf4jに縛られていない場合は、Logulaをチェックしてください。私は最近それで遊んでいて、それが好きです。

于 2012-08-13T21:04:04.560 に答える
0

文字列補間を使用するとどうなりますか? そのようです:

log.info(f"parameters ${param1} and ${param2} and ${param3}")
于 2013-08-18T17:34:07.660 に答える
-1

これを試して:

Array(...).asInstanceOf[Array[Object]]
于 2012-08-13T21:15:51.443 に答える