考虑一下我们有:
abstract class FlyingObject;
case class Rocket(name: String) extends FlyingObject;
这两个函数声明之间有什么区别:
def launch[T <: FlyingObject](fo: T)
和
def launch(fo: FlyingObject)
何时使用哪种类型的声明将是一个很好的例子。
[更新]
另一个很好的例子和解释可以在there中找到。这是何时应该使用上限而不是仅将派生类作为参数的另一个示例。
最佳答案
拥有一个比FlyingObject更具体的T可能会很有用。也许想象你有一个方法
def modifyName(fo: FlyingObject, newName: String): FlyingObject = fo.copy(name=newName)
它返回带有修改名称的FlyingObject的副本。这使得此代码无法进行类型检查:
val newRocket: Rocket = modifyName(oldRocket, "new name")
由于modifyName返回的是FlyingObject,而不是Rocket。反而:
def modifyName[T <: FlyingObject](fo: T, newName: String): T = fo.copy(name=newName)
当火箭是传入的东西时,将返回一个火箭。
关于scala - 函数参数: upper bound vs parent class as argument?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10284779/