假设我试图表示布尔逻辑的域(暂时忽略缩减)。所以我会在我的商店实例中包含Bools,Ands和Ors或Nots等等。但是,虽然我会对这些事情有具体的表述,但在很多情况下我所关心的是,有些东西可以说是被视为Bool,或者是两个Bool的组合(这在这里没有意义,但更大的例子是某种异构数据存储,我可能会要求,例如,所有可能有颜色的东西)。有多个潜在的层次结构,因此子类化并没有真正削减它,因为我想避免显式转换,所以类型类似乎是要走的路。所以我有这样的事情:
trait Delegated[-B, +A] {
def bind(b : B) : A
}
trait Thing[A <: Thing[A]] {
type Class[B] = Delegated[B,A]
}
trait BoolLike extends Thing[BoolLike] {
def value : Boolean
}
class Bool(val value : Boolean) extends BoolLike
然而,现在,为了避免重复自己,我想指出,对于任何Thing
,子类将满足Thing#Class
。所以我对此的尝试如下:
implicit def SubclassIsClass[A <: Thing[A], B <: A] : A#Class[B] = new A#Class[B] {
def bind(b : B) = b
}
然而,如果我这样做
implicitly[BoolLike#Class[Bool]]
我没有得到任何证据,但我可以很高兴地致电SubclassIsClass[BoolLike, Bool]
并获得一名合适的代表。这是否可以隐含地推断?
答案 0 :(得分:0)
解决了 - 如果我改变了
trait Delegated[-B, +A]
到
trait Delegated[B,A]
然后这个工作。鉴于注释是从不同的做事方式遗留下来的,这似乎是一个很好的解决方案。