4

この問題は、次のコードで見つけることができます。

      def debug[T](format: String, arg1:T, arg2:Any, args:Any*):T = {
        logger.debug(format, (arg1 :: arg2 :: args.toList).toArray)
        arg1
      }

2 番目のパラメーターとして渡すのは Any の配列であるため、このコードは SLF4J のデバッグ メソッドを呼び出す必要があります。

      public void debug(String format, Object[] argArray);

まだ

      public void debug(String format, Object arg);

代わりに呼び出されます。

例を挙げましょう。

電話すると

    debug("The four parameters are {} as String, {} as Integer, {} as String and {} as Integer.", "1", 2, "3", 4)

記録する

    DEBUG - The four parameters are [1, 2, 3, 4] as String, {} as Integer, {} as String and {} as Integer.

それ以外の

    DEBUG - The four parameters are 1 as String, 2 as Integer, 3 as String and 4 as Integer.

注1: ​​最初の呼び出しはscala.Array Scaladocに基づいて機能すると想定しました。

多相配列を表します。Array[T] は、Java の T[] に対する Scala の表現です。

注 2: 私の質問の元となったコードは、https://github.com/alexmsmartins/UsefullScalaStuff/blob/master/src/main/scala/alexmsmartins/log/LoggerWrapper.scalaにあります。

これは、Scala プロジェクトで使用する slf4j の小さなラッパーです。

4

2 に答える 2

2

を渡すのArray[Any]ではなく、を渡しArray[Object]ます。タイプをからAnyに変更してみることができます(この場合、などのAnyRefを渡すことはできません)。後に電話をかけることもできますが、この1つの特定のケースでは、消去は同じであるため、問題は発生しません。AnyValInt.asInstanceOf[Array[AnyRef]].toArray

于 2011-11-10T20:26:10.150 に答える
2

使用する必要があります: (arg1 :: args2 :: args.toList).toSeq: _ *- 仕組みをStringLike.format見る

リストの作成を選択すると、デバッグ呼び出しのオブジェクトの作成に関してかなりのオーバーヘッドが発生します (確かに、配列の作成を減らすことの利点は無効になります)

于 2011-11-10T18:03:21.817 に答える