如何使用抽象类型将以下 F-Bound 多态性转换为代码?
trait Organism[Self <: Organism[Self]] { self: Self =>
def reproduceWith(org:Self):Boolean
}
class Amoeba extends Organism[Amoeba] {
def reproduceWith(org:Amoeba) = //..code
}
最佳答案
有多种方法可以做到这一点。这是我喜欢的一种方式,类似于“参数化模块”
OCaml 或 Agda。
当您定义 Organism
类型,您将其拆分为抽象类型 Organism
和一个特质 OrganismOps
.然后你将这两个包装在一个特征中:
trait OrganismSystem {
type Organism <: OrganismOps
trait OrganismOps {
def reproduceWith(org: Organism): Boolean
}
}
因为它们被包裹在相同的特征中,
OrganismOps
可以看到Organism
类型。现在,如果你想创建这些东西的具体实例,你可以这样做:
object MyOrganismSystem extends OrganismSystem {
case class Organism(species: String) extends OrganismOps {
def reproduceWith(org: Organism) = species == org.species
}
}
如果你想定义在有机体系统上通用的方法,你会让他们接受
OrganismSystem
作为参数,或者等效地,将它们包装在一个接受 OrganismSystem
的类中作为参数:class UsesGenericOrganismSystem(system: OrganismSystem) {
import system._
def allCompatible(organisms: Traversable[Organism]): Boolean =
organisms.toSeq.combinations(2) forall {
case Seq(o1, o2) => o1.reproduceWith(o2)
}
}
关于scala - 使用抽象类型而不是参数类型的 F-Bound 多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16256965/