【发布时间】:2023-02-06 04:28:36
【问题描述】:
我有一个特征 Mutable[T],它描述了可以使用 Mutation 对象突变为 T 的对象:
trait Mutable[T] {
def mutate(mutation: Mutation): T
}
class Mutation {
def perform[T <: Mutable[T]](mutable: T): T = mutable.mutate(this)
}
我还有两个描述一般动物和特定哺乳动物的特征。
我想要求 Animal 可以变异为另一个 Animal,但 Mammal 只能变异为另一个 Mammal。但是,以下内容不会编译:
trait Animal extends Mutable[Animal]
trait Mammal extends Animal, Mutable[Mammal]
case class Fish() extends Animal {
override def mutate(mutation: Mutation): Animal = Fish()
}
// error: class Monkey cannot be instantiated since it has conflicting base types Mutable[Animal] and Mutable[Mammal]
case class Monkey() extends Mammal {
override def mutate(mutation: Mutation): Mammal = Monkey()
}
我想按如下方式使用这些类型:
val mutation = new Mutation()
val fish: Animal = Fish()
val fish2: Animal = mutation.perform(fish)
val monkey: Mammal = Monkey()
val monkey2: Mammal = mutation.perform(monkey)
【问题讨论】: