[英]Function arguments: upper bound vs parent class as argument?
考虑一下我们有:
abstract class FlyingObject;
case class Rocket(name: String) extends FlyingObject;
这两个函数声明之间有什么区别:
def launch[T <: FlyingObject](fo: T)
和
def launch(fo: FlyingObject)
如果使用哪种类型的声明,那将是一些很好的例子......
[UPDATE]
在那里可以找到另一个很好的例子和解释。 这是你应该使用上限而不仅仅是派生类作为参数的另一个例子。
拥有一个比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)
当Rocket传入时,将返回Rocket。
除了@stew回答之外,在使用类型类时,上限可能很有用。 例如,假设您需要一个捕获两个飞行对象的方法以及一个定义如何管理与其他对象的碰撞的碰撞对象。 当然,小行星 - 小行星碰撞与宇宙飞船 - 小行星碰撞(经典教科书示例)不同。
您可以编写以下方法:
def collide[A <: FlyingObject, B <: FlyingObject]
( a: A, b: B )( implicit collider: Collider[A,B] ) = collider.apply(a,b)
然后编译器将为您提供正确的Collider
。 相反,你写道:
def collide( a: FlyingObject, b: FlyingObject ) = a.collide(b)
您将不得不依赖面向Obect的功能来管理难以编写和维护的冲突(双重调度问题)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.