scala - 还有什么是Scala惯用: trait TraitA extends TraitB or trait TraitA { self: TraitB => }

标签 scala inheritance traits self-type

除了继承方面之外,以下类模板之间是否有区别:

1| trait TraitA extends TraitB

2| trait TraitA { self: TraitB => }

我想在 TraitATraitB 之间分配职责,但如果没有后者,前者就无法运行。

您将如何表达此意图?对我来说,解决方案 [2] 将是更自然的方法。然而,无论如何,我不想给实现者带来混合需要混合的负担。

最佳答案

我的偏好通常是[1],因为正如您所说,实现者没有负担混合TraitB(的子类型)。如果出于某种原因,希望继承TraitB中的具体实现并强制实现者在子类型中做出选择,那么也许[2]更可取。 特征B。尽管如此,[1] 同样灵活。

我倾向于仅在必要时使用 [2],例如当类型不是已知的类或特征时,

// Here, Matrix cannot extend type parameter Repr
trait Matrix[+Repr <: Matrix[Repr]] { self: Repr =>
  ...
}

更新。这是另一个细微差别,

trait B
trait A { self: B => }
def g(ab: A): B = ab // Type mismatch: found A, required B

有点烦人一个可选限制不能将A用作B,即使尽管类型已合并。

关于scala - 还有什么是Scala惯用: trait TraitA extends TraitB or trait TraitA { self: TraitB => },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7250374/

相关文章:

json - 使用Shapeless HList轻松构建Json Decoder

arrays - Scala:如何按元组的第二个元素对元组数组进行排序?

scala - flatmap 是否比 filter+map 提供更好的性能?

java - 使用 Super/Sub 类型重载方法/构造函数

c# - 在覆盖期间将返回类型更改为派生类型

generics - 如何安全地存储通用值的不可变别名副本?

scala:重用子类实现作为两个不同类的子类?

java - 如何将 CSV 文件加载到 Apache Arrow vectors 并将箭头文件保存到磁盘

java - 如何在 Java 中以基类为参数的方法中构造派生类的对象?

php - 如何使用 PHP7 从静态方法调用特征的非静态方法?