java - 如何让 JVM 在多态方法调用中将 scala.Array[T] 识别为 java 数组 T[]?

标签 java scala polymorphism slf4j jvm-languages

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

      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.

注意 1:我假设第一个调用会基于 scala.Array Scaladoc 工作.

Represents polymorphic arrays. Array[T] is Scala's representation for Java's T[].

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

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

最佳答案

您传递的是 Array[Any],而不是 Array[Object]。您可以尝试将类型从 Any 更改为 AnyRef(在这种情况下您将无法传递 AnyVal,例如 整数)。您还可以在 .toArray 之后调用 .asInstanceOf[Array[AnyRef]],在这种特殊情况下,这不会给您带来麻烦,因为删除是相同的.

关于java - 如何让 JVM 在多态方法调用中将 scala.Array[T] 识别为 java 数组 T[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8083840/

相关文章:

java - 将 jndi 变量公开为属性占位符

java - 为什么我们可以为 TreeSet 提供 Comparator,但不能为 HashSet 提供类似 Hasher 的东西?

java - 抽象类的子类看不到构造函数

regex - Scala 正则表达式中的可选分组

scala - 如何使用 Apache Spark Scala 获取大型 CSV/RDD[Array[double]] 中所有列的直方图?

c++ - 防止使用重写的非虚函数 - 正确的方法?

java - 实现一个不仅仅是设置变量的 Scala 构造函数

scala - Scala 中的并行迭代器

c++ - 指针重新分配和多态性

c++ - 当我覆盖 C++ 函数时,是否应该再次指定 'virtual'?