【问题标题】:What does it mean to type alias a structural type?类型别名结构类型是什么意思?
【发布时间】:2020-11-21 12:08:24
【问题描述】:

我最近遇到了这样的事情

object example {
   type DButil = AnyRef {
     val a: Int
     def b: String
   }
}

让我困惑的是这里AnyRef的用法,后来我再挖掘一下,我发现你也可以这样做:

object apple {}
object example {
   type DButil = apple.type {
     val a: Int
     def b: String
   }
}

我以前从未见过这种模式,感谢任何见解和 cmets。

【问题讨论】:

  • 是结构类型。基本上,DButil 是任何具有 Int 类型的 a 字段的任何东西,并且没有接收任何 a 的方法 b 返回一个 String;在第二个例子中,这种类型也必须是apple 的子类。恕我直言,这些是一个不好的功能;结构类型在反射中中继(因此不安全、缓慢、不安全且便携性较差),并且不像他们所说的那样灵活。根据我的经验,它们主要由来自 PythonJS 等语言的新手使用,并且不知道如何正确建模多态性。
  • 有趣的是,Programming In Scala 第 3 版放弃了第 2 版关于细化类型之外的结构子类型的讨论。

标签: scala type-alias structural-typing


【解决方案1】:

类型别名只是类型的附加名称。 像这样的建筑 任何参考 { val a: 整数 def b: 字符串 } 苹果类型 { val a: 整数 def b: 字符串 } SomeSuperType { val结构成员1:整数 def structureMember2:字符串 }

是继承超类行为并包含大括号中定义的附加结构类型部分的匿名类/类型。 类型别名只是该匿名类型的名称。

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 2015-02-20
    • 1970-01-01
    • 2020-04-29
    • 2016-07-27
    • 1970-01-01
    • 2016-09-15
    • 2015-01-03
    • 1970-01-01
    相关资源
    最近更新 更多