【问题标题】:Autocasting types using 'value: Type' syntax使用“值:类型”语法自动转换类型
【发布时间】:2019-07-26 22:01:07
【问题描述】:

当我阅读Scala reflection tutorial时。我发现一个非常连贯的语法如下。

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

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

【问题讨论】:

  • obj : Type 表示将对象视为该类型,您可能会认为它像obj.asInstanceOf[Type] 但是,首先它是类型安全的,其次它更强大,例如,在这种情况下它触发隐式转换
  • @LuisMiguelMejíaSuárez 感谢您的快速回复。你知道任何关于这种语法的参考资料吗?
  • 它应该在specs中的某个地方。

标签: scala ascription


【解决方案1】:

这个语法叫做type ascription:

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

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

def member(name: Name): Symbol

因此它期待Name 类型的输入

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

给出错误,因为"map" 不是Name。提供type ascription"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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多