Как заставить JVM распознавать scala.Array [T] как массив java T [] при вызове полиморфного метода? - PullRequest
4 голосов
/ 10 ноября 2011

Проблема может быть найдена в следующем коде:

      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 .

Представляет полиморфные массивы. Массив [T] - это представление Scala для T [] в Java.

ПРИМЕЧАНИЕ 2. Код, с которого возник мой вопрос, можно найти по адресу https://github.com/alexmsmartins/UsefullScalaStuff/blob/master/src/main/scala/alexmsmartins/log/LoggerWrapper.scala

.

Это небольшая оболочка вокруг slf4j, которую я использую в своих проектах Scala.

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011

Вы передаете Array[Any], а не Array[Object].Вы можете попробовать изменить типы с Any на AnyRef (в этом случае вы не сможете передать AnyVal, например Int).Вы также можете позвонить .asInstanceOf[Array[AnyRef]] после .toArray, что, в данном конкретном случае, не должно доставлять вам хлопот, потому что стирание такое же.

2 голосов
/ 10 ноября 2011

Вам необходимо использовать: (arg1 :: args2 :: args.toList).toSeq: _ * - посмотрите, как работает StringLike.format

Ваш выбор создания списка вызовет немало накладных расходов с точки зрения создания объекта для вызова отладки (безусловно, это сводит на нет любые преимущества сокращения ИМХО создания массива)

...