scala - 函数参数: upper bound vs parent class as argument?

标签 scala types parameters function-declaration

考虑一下我们有:

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/

相关文章:

scala - Scala 中的 lambda 类型是什么?它们有什么好处?

scala - 简化类型注解

python - 如何在 Python 中键入提示通用数字类型?

typescript :至少需要一个参数时使用扩展运算符

MySql - 当 URL 中提供密码时,MySql 服务器认为没有密码

scala - PowerMock 无法解决不明确的引用

c# - 静态类的 TypeAttribute

list - 在 Dart 中,List.from 和 .of、Map.from 和 .of 之间有什么区别?

php - 如何将 PHP 字符串传递给 Javascript 函数调用?

java - 从 ExecutionContext 获取参数