这是一个具有两个特征的简单设置,一个具有由先前特征限制的协变类型参数的类,以及具有由另一个类限制的类型参数的第二个类。对于这两个类,只有当两个特征之一是类型参数的基础时,一个特定的方法才可用(通过隐式证据)。这编译得很好:
trait Foo
trait ReadableFoo extends Foo {def field: Int}
case class Bar[+F <: Foo](foo: F) {
def readField(implicit evidence: F <:< ReadableFoo) = foo.field
}
case class Grill[+F <: Foo, +B <: Bar[F]](bar: B) {
def readField(implicit evidence: F <:< ReadableFoo) = bar.readField
}
但是,由于Bar
在 中是协变的F
,我不应该需要在 中的F
参数Grill
。我应该只要求它B
是Bar[ReadableFoo]
. 然而,这失败了:
case class Grill[+B <: Bar[_]](bar: B) {
def readField(implicit evidence: B <:< Bar[ReadableFoo]) = bar.readField
}
出现错误:
error: Cannot prove that Any <:< this.ReadableFoo.
def readField(implicit evidence: B <:< Bar[ReadableFoo]) = bar.readField
为什么不考虑隐含的证据?