当我阅读Scala 反射教程时。我发现一个非常连贯的语法如下。
import scala.reflect.runtime.universe._
typeOf[List[_]].member("map": TermName)
所以member
函数接受Name
类型参数,然后"map": TermName
传递给它。这个语法到底是什么意思?我猜这是糖的捷径.member(TermName("map"))
。
当我阅读Scala 反射教程时。我发现一个非常连贯的语法如下。
import scala.reflect.runtime.universe._
typeOf[List[_]].member("map": TermName)
所以member
函数接受Name
类型参数,然后"map": TermName
传递给它。这个语法到底是什么意思?我猜这是糖的捷径.member(TermName("map"))
。
这种语法称为类型归属:
为了类型检查器,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)