Scala: неявное свидетельство для класса с параметром типа
Вот простая установка с двумя признаками: класс с ковариантным параметром типа, ограниченным предыдущими признаками, и второй класс с параметром типа, ограниченным другим классом. Для обоих классов конкретный метод доступен (посредством неявного доказательства), только если одна из двух черт лежит в основе параметра типа. Это хорошо компилируется:
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
Почему неявные доказательства не принимаются во внимание?