【发布时间】: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的子类。恕我直言,这些是一个不好的功能;结构类型在反射中中继(因此不安全、缓慢、不安全且便携性较差),并且不像他们所说的那样灵活。根据我的经验,它们主要由来自 Python 或 JS 等语言的新手使用,并且不知道如何正确建模多态性。 -
有趣的是,Programming In Scala 第 3 版放弃了第 2 版关于细化类型之外的结构子类型的讨论。
标签: scala type-alias structural-typing