考虑一下我们有:

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/

10-11 22:25