Столкнулся это странное поведение при изменении верхней границы в реализации, но забыл его изменить в интерфейсе. Я думаю, что последний оператор не должен компилироваться, но он делает и возвращает неожиданный результат.Странное поведение типа вывода в функции с верхней границей
trait SuperBase
trait Base extends SuperBase
class SuperBaseImpl extends SuperBase
trait Service {
def doWork[T <: Base : Manifest](body: T => Unit): String
def print[T <: Base : Manifest]: String
}
object ServiceImpl extends Service {
override def doWork[T <: SuperBase : Manifest](body: T => Unit): String =
print[T]
def print[T <: SuperBase : Manifest]: String =
manifest[T].runtimeClass.toString
}
val s: Service = ServiceImpl
// does not compile as expected
// s.print[SuperBaseImpl]
// returns "interface Base"
s.doWork { x: SuperBaseImpl =>() }
Редактировать
Как @ сома-snytt упоминается с -Xprint:typer
опции мы можем увидеть, что на самом деле компилятор выводит:
s.doWork[Base with SuperBaseImpl]
Это объясняет, почему мы получаем "интерфейс Base". Но я до сих пор не совсем понимаю, как и зачем работать с типом в этом случае.
Спасибо, но я считаю, что проще просто определить 'T':' s.doWork [SuperBaseImpl] {x =>()} '. –