Consider we have:
abstract class FlyingObject;
case class Rocket(name: String) extends FlyingObject;
what is difference between those two function declarations:
def launch[T <: FlyingObject](fo: T)
and
def launch(fo: FlyingObject)
Great would be some examples when to use which type of declaration...
[UPDATE]
Another great example and explanation can be found there. It's another example of when you should use upper bound instead of just derived class as parameter.