Подтвердить что ты не робот

Выделение подчеркивания для совместимости Java в Scala

Предположим, что у меня есть код Scala, который вызывает библиотеку Java, которая использует _ как идентификатор (и я делаю - это долгая история). Здесь упрощенный пример:

public class StupidUnderscore {
  public static String _() { return "Please give me a real name!"; }
}

Нет проблем, не так ли? Просто избегайте этого:

scala> StupidUnderscore.`_`
res0: String = Please give me a real name!

И это всегда срабатывало, пока я не попытался обновиться до Scala 2.10.2 сегодня утром:

scala> StupidUnderscore.`_`
<console>:1: error: wildcard invalid as backquoted identifier
       StupidUnderscore.`_`
                        ^

Это связано с изменением, которое появилось в 2.10.1 и исправлено этой проблемой. Из сообщения о фиксации:

Запретить _ как идентификатор, он может только принести вред.

Ну, конечно, но я не знаю, почему это означает, что я не могу сбежать от этого - я думал, для чего нужны обратные запросы.

Мне нужно написать оболочку Java, чтобы заставить это работать? Есть ли другой способ я могу ссылаться на метод библиотеки Java _ в Scala?


Как сноска, я подтвердил, что можно обойти эту проблему без написания новой Java:

object AwfulMacroHack {
  import scala.language.experimental.macros
  import scala.reflect.macros.Context

  def _impl(c: Context) = {
    import c.universe._
    c.Expr[String](
      Select(Ident(newTermName("StupidUnderscore")), newTermName("_"))
    )
  }

  def `I'm not named _!` = macro _impl
}

И затем:

scala> AwfulMacroHack.`I'm not named _!`
res0: String = Please give me a real name!

Я не уверен, что это менее ужасно, чем решение Java-помощника.

4b9b3361

Ответ 1

Так как обратные ссылки являются механизмом взаимодействия Java с идентификаторами (например. Thread.yield()), я сомневаюсь, что есть другой способ без использования Reflection. Я бы сказал, что ваш лучший выбор (пока ошибка не будет исправлена) заключается в том, чтобы написать статический вспомогательный метод в Java для доступа к _.

Я знаю, что это совершенно смешно, но это, вероятно, все же лучше, чем использование рефлексии. Они нарушили взаимодействие Java с этим патчем, поэтому в конечном итоге им придется решить эту проблему. Однако, пока они это сделают, я думаю, что он просто сломан.