当前位置:  开发笔记 > 编程语言 > 正文

Scala lower type bound'是对方法参数的子类型限制

如何解决《Scalalowertypebound'是对方法参数的子类型限制》经验,为你挑选了1个好方法。

在Scala中,为什么在方法类型参数上设置较低的类型边界不会对方法争论强制执行"超类型"限制?

object TypeBounds extends App {
  class MotorVehicle
  class Truck extends MotorVehicle
  class Car extends MotorVehicle
  class Saloon extends Car
  class HatchBackSaloon extends Saloon

  def lowerTypeBound[C >: Car](c: C): C = c

  def upperTypeBound[C <: Car](c: C): C = c

  // Works. HatchBackSaloon is a sub class of Car
  println(upperTypeBound(new HatchBackSaloon())) 

  // as expected doesn't compile. Truck is not a subclass of Car    
  println(upperTypeBound( new Truck()))  

  // Compiles and runs, but why ?  HatchBackSaloon is not a super class of Car.
  println(lowerTypeBound(new HatchBackSaloon())) 

}

Dima.. 6

C在您的示例中,实现为Car,而不是HatchbackSaloon.

一个函数看起来def lowerTypeBound(c: Car): Car可以接受类型的参数HatchbackSaloon,这并不奇怪,对吧?

尝试这样的事情:

val result: HatchBackSaloon = lowerTypeBound(new HatchBackSaloon)

这将无法编译,因为它需要CHatchbackSaloon,这不是一个超类Car.但这会奏效:

val result: MotorVehicle = lowerTypeBound(new HatchbackSaloon)

因为CMotorVehicle这里,这是允许的.



1> Dima..:

C在您的示例中,实现为Car,而不是HatchbackSaloon.

一个函数看起来def lowerTypeBound(c: Car): Car可以接受类型的参数HatchbackSaloon,这并不奇怪,对吧?

尝试这样的事情:

val result: HatchBackSaloon = lowerTypeBound(new HatchBackSaloon)

这将无法编译,因为它需要CHatchbackSaloon,这不是一个超类Car.但这会奏效:

val result: MotorVehicle = lowerTypeBound(new HatchbackSaloon)

因为CMotorVehicle这里,这是允许的.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有