假设我试图表示布尔逻辑的域(暂时忽略归约)。因此,我将在我的商店中拥有 Bools 或 Ands 和 Ors 或 Nots 等实例。然而,虽然我会对这些东西有具体的表示,但在许多情况下,我所关心的是某些东西可以,比如说,是被视为一个布尔值,或两个布尔值的组合(这在这里不太有意义,但更大的例子是某种异构数据存储,我可能会在其中请求所有可能有颜色的东西)。有多个潜在的层次结构,所以子类化并没有真正削减它,而且由于我想避免显式转换,类型类似乎是要走的路。所以我有这样的事情:
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]
并获得合适的代表。这应该是隐含的推断吗?