强制Scala特性不兼容

时间:2019-06-28 19:58:46

标签: scala inheritance traits

有办法阻止两个特质混在一起吗?

我知道您可以使用自我类型注释来要求仅将特征混入特定类型的类中,但是您可以使用类似的构造来要求目标类不混入特定特征吗?

例如:

abstract class Collector(p: Boolean)

trait Cache

trait ACache extends Cache { self: Collector => }

trait BCache extends Cache { self: Collector => }

我是否可以要求将CollectorACache的任何实现混入BCacheACache或不具有任何缓存特征,但不能同时BCacheclass GoodCollector(p: Boolean) extends Collector(p) with ACache //legal class BadCollector(p: Boolean) extends Collector(p) with ACache with BCache //illegal

{{1}}

1 个答案:

答案 0 :(得分:7)

如果您这样更改Cache

trait Cache[A <: Cache[_]]

trait ACache extends Cache[ACache] { self: Collector =>
}

trait BCache extends Cache[BCache] { self: Collector =>
}

然后:

class BadCollector(p: Boolean) extends Collector(p) with ACache with BCache 

将失败,并显示:

  

非法继承;    BadCollector类继承了特征缓存的不同类型实例:   缓存[BCache]和缓存[ACache]     类BadCollector(p:Boolean)使用带有BCache的ACache扩展了Collector(p)