これは、2つの特性を持つ単純なセットアップです。前の特性によって制限された共変型パラメーターを持つクラスと、他のクラスによって制限された型パラメーターを持つ2番目のクラスです。どちらのクラスでも、2つの特性のいずれかがtypeパラメーターの基礎となる場合にのみ、特定のメソッドを(暗黙の証拠を介して)使用できます。これはうまくコンパイルされます:
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
暗黙の証拠が考慮されていないのはなぜですか?