Учтите, что у нас есть:
abstract class FlyingObject;
case class Rocket(name: String) extends FlyingObject;
в чем разница между этими двумя объявлениями функций:
def launch[T <: FlyingObject](fo: T)
и
def launch(fo: FlyingObject)
Было бы здорово привести несколько примеров, когда какой тип объявления использовать...
[ОБНОВЛЕНИЕ]
Еще один замечательный пример и объяснение можно найти здесь . Это еще один пример того, когда вы должны использовать верхнюю границу вместо просто производного класса в качестве параметра.