4

当我阅读Scala 反射教程时。我发现一个非常连贯的语法如下。

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

所以member函数接受Name类型参数,然后"map": TermName传递给它。这个语法到底是什么意思?我猜这是糖的捷径.member(TermName("map"))

4

1 回答 1

4

这种语法称为类型归属

为了类型检查器,Ascription 基本上只是在编译时执行的向上转换。

在这里使用它是因为它的签名member

def member(name: Name): Symbol

Name因此它期望输入类型

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

给出错误,因为"map"is not 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)
于 2019-07-26T22:10:45.723 回答