Scala 在这些方法中,带上限的参数多态性和子类型多态性之间有什么区别?

Scala 在这些方法中,带上限的参数多态性和子类型多态性之间有什么区别?,scala,Scala,假设我们有两个方法签名 def drive[U <: Vehicle](c : U) = ??? def drive(c : Vehicle) = ??? def-drive[U考虑用于从概念上区分这两种多态性的术语 参数多态性 亚型多态性 方法 def drive(c: Vehicle) 既具有参数单态性,因为它没有类型参数,又具有子类型多态性,因为它可以采用Lada以及Tesla 在这种特殊情况下,这两种方法受到同等的约束 def drive[U <: Vehicle](

假设我们有两个方法签名

def drive[U <: Vehicle](c : U) = ???
def drive(c : Vehicle) = ???

def-drive[U考虑用于从概念上区分这两种多态性的术语

  • 参数多态性
  • 亚型多态性
方法

def drive(c: Vehicle)
既具有参数单态性,因为它没有类型参数,又具有子类型多态性,因为它可以采用
Lada
以及
Tesla

在这种特殊情况下,这两种方法受到同等的约束

def drive[U <: Vehicle](c : U) = ???
def drive(c : Vehicle) = ???
def驱动[U]车辆
|案例对象Škoda扩展车辆
|案例对象特斯拉扩展车辆
特质载体
对象什柯达
特斯拉物体
scala>def f(a:车辆,b:车辆)=a
def f(a:车辆,b:车辆):车辆
scala>f(什柯达,特斯拉)
val res21:车辆=什柯达

scala>def f[不同的用例。如果您只是使用参数,它们是相同的,但是如果您需要输出依赖于输入类型的类型,第一个用例允许使用where did“Product”来自?这一行是什么意思?
val res22:Product with Vehicle with java.io.Serializable=Škoda
这只是一个Scala类型的推理怪癖。你可以用
sealed trait Vehicle extensed Product with Serializable来摆脱它
scala> sealed trait Vehicle
     | case object Škoda extends Vehicle
     | case object Tesla extends Vehicle
trait Vehicle
object Škoda
object Tesla

scala> def f(a: Vehicle, b: Vehicle) = a
def f(a: Vehicle, b: Vehicle): Vehicle

scala> f(Škoda, Tesla)
val res21: Vehicle = Škoda

scala> def f[A <: Vehicle](a: A, b: A) = a
def f[A <: Vehicle](a: A, b: A): A

scala> f(Škoda, Tesla)
val res22: Product with Vehicle with java.io.Serializable = Škoda
trait FixableByHittingIt[A]

implicit val fixLadaByHittingIt = new FixableByHittingIt[Lada.type] {}

def drive[U <: Vehicle](c : U)(implicit ev: FixableByHittingIt[U]) = ???

drive(Lada)   // ok
drive(Tesla)  // nope, needs sci-fi mechanic