强制Scala特性不兼容

D C*_*hen 4 inheritance scala traits

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

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

例如:

abstract class Collector(p: Boolean)

trait Cache

trait ACache extends Cache { self: Collector => }

trait BCache extends Cache { self: Collector => }
Run Code Online (Sandbox Code Playgroud)

我可以要求任何实现Collector混合的ACacheBCache或者没有缓存的任何特征,但不能ACacheBCache同时?

class GoodCollector(p: Boolean) extends Collector(p) with ACache //legal
class BadCollector(p: Boolean) extends Collector(p) with ACache with BCache //illegal
Run Code Online (Sandbox Code Playgroud)

Krz*_*sik 7

如果您这样更改Cache

trait Cache[A <: Cache[_]]

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

trait BCache extends Cache[BCache] { self: Collector =>
}
Run Code Online (Sandbox Code Playgroud)

然后:

class BadCollector(p: Boolean) extends Collector(p) with ACache with BCache 
Run Code Online (Sandbox Code Playgroud)

将失败:

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