It may be helpful to have a T that is more specific than a FlyingObject. Perhaps imagine you have a method
def modifyName(fo: FlyingObject, newName: String): FlyingObject = fo.copy(name=newName)
Returns a copy of the FlyingObject with the changed name. This makes this code not typecheck:
val newRocket: Rocket = modifyName(oldRocket, "new name")
modifyName FlyingObject, Rocket. :
def modifyName[T <: FlyingObject](fo: T, newName: String): T = fo.copy(name=newName)
Rocket, Rocket - , .