4

问题可以在以下代码中找到:

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

由于我作为第二个参数传递的是一个 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.

NOTE1:我假设第一个调用将基于scala.Array Scaladoc工作。

表示多态数组。Array[T] 是 Scala 对 Java 的 T[] 的表示。

NOTE2:我的问题的代码可以在https://github.com/alexmsmartins/UsefullScalaStuff/blob/master/src/main/scala/alexmsmartins/log/LoggerWrapper.scala找到

这是我在 Scala 项目中使用的 slf4j 的一个小包装器。

4

2 回答 2

2

你需要使用:(arg1 :: args2 :: args.toList).toSeq: _ *- 看看如何StringLike.format工作

您对创建列表的选择将在调试调用的对象创建方面造成相当大的开销(当然它否定了减少数组创建恕我直言的任何好处)

于 2011-11-10T18:03:21.817 回答
2

你正在传递一个Array[Any],而不是一个Array[Object]。您可以尝试将类型从Anyto更改AnyRef(在这种情况下,您将无法传递AnyVal's such Int)。您也可以调用.asInstanceOf[Array[AnyRef]]after .toArray,在这种特殊情况下,它不应该给您带来麻烦,因为擦除是相同的。

于 2011-11-10T20:26:10.150 回答