Автопоказ типов с использованием синтаксиса "значение: тип"
Когда я читаю учебник по отражению 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)