Автопоказ типов с использованием синтаксиса "значение: тип"

Когда я читаю учебник по отражению Scala. Я нашел синтаксис, очень похожий на следующий.

  import scala.reflect.runtime.universe._
  typeOf[List[_]].member("map": TermName)

Так что member функция занимает Name введите параметр, а затем "map": TermName передается в это. Что именно означает этот синтаксис? Я предполагаю, что это ярлык сахара для .member(TermName("map")),

1 ответ

Решение

Этот синтаксис называется типом ascription:

По сути, Ascription - это просто приведение, выполняемое во время компиляции ради проверки типов.

Это используется здесь, потому что подпись member является

def member(name: Name): Symbol

так что ожидается ввод типа Name следовательно

typeOf[List[_]].member("map")

дает ошибку, потому что "map" не является Name, Предоставление типа надписи "map": Name запускает неявное преобразование

typeOf[List[_]].member(stringToTermName("map"): TermName)

однако то же самое может быть достигнуто с более явным

typeOf[List[_]].member(TermName("map"))

Неявное преобразование stringToTermName техника устарела

  /** An implicit conversion from String to TermName.
   * Enables an alternative notation `"map": TermName` as opposed to `TermName("map")`.
   * @group Names
   */
  @deprecated("use explicit `TermName(s)` instead", "2.11.0")
  implicit def stringToTermName(s: String): TermName = TermName(s)
Другие вопросы по тегам