Шаблон класса типов в Scala не учитывает наследование?

В некоторых случаях я разрабатываю API, используя классы типов, однако я столкнулся с проблемой неявного разрешения. Как показано ниже, если существует неявный объект для типа A, но объект типа B extends A передается методу, то неявный объект не может быть найден. Есть ли способ заставить эту работу работать или вызывающие должны помещать неявные объекты в область видимости для каждого подкласса?

Вот пример:

class A
class B extends A

class T[+X]

object T {
  implicit object TA extends T[A]
}

def call[X:T](x:X) = println(x)

// compiles
call(new A)
// doesn't compile
call(new B)

var a = new A
// compiles
call(a)

a = new B
// compiles
call(a)

val b = new B
// doesn't compile
call(b)

Это не может быть скомпилировано со следующим выводом:

/private/tmp/tc.scala:16: error: could not find implicit value for evidence parameter of type this.T[this.B]
call(new B)
    ^
/private/tmp/tc.scala:28: error: could not find implicit value for evidence parameter of type this.T[this.B]
call(b)
9
задан Jesse Eichar 6 October 2010 в 06:29
поделиться