函数参数:上限vs父类作为参数?

Pri*_*osK 5 parameters types scala function-declaration

考虑一下我们有:

abstract class FlyingObject;
case class Rocket(name: String) extends FlyingObject;
Run Code Online (Sandbox Code Playgroud)

这两个函数声明之间有什么区别:

def launch[T <: FlyingObject](fo: T)
Run Code Online (Sandbox Code Playgroud)

def launch(fo: FlyingObject)
Run Code Online (Sandbox Code Playgroud)

如果使用哪种类型的声明,那将是一些很好的例子......

[UPDATE]

那里可以找到另一个很好的例子和解释.这是你应该使用上限而不仅仅是派生类作为参数的另一个例子.

ste*_*tew 7

拥有一个比FlyingObject更具体的T可能是有用的.也许想象你有一个方法

def modifyName(fo: FlyingObject, newName: String): FlyingObject = fo.copy(name=newName)
Run Code Online (Sandbox Code Playgroud)

返回带有修改名称的FlyingObject的副本.这使得这段代码不是类型检查:

val newRocket: Rocket = modifyName(oldRocket, "new name")
Run Code Online (Sandbox Code Playgroud)

由于modifyName返回FlyingObject而不是Rocket.代替:

def modifyName[T <: FlyingObject](fo: T, newName: String): T = fo.copy(name=newName)
Run Code Online (Sandbox Code Playgroud)

当Rocket传入时,将返回Rocket.

  • @LuigiPlinge:也许当它在类型签名中的其他地方使用时.因为你可能想要`def compare [T <:FlyingObject](一个:T,两个:T) (2认同)