Scala中泛型类型之间的比较
Posted
技术标签:
【中文标题】Scala中泛型类型之间的比较【英文标题】:Comparisons between generic types in Scala 【发布时间】:2021-07-31 10:31:48 【问题描述】:考虑以下代码段-
abstract class Vehicle
val name: String
case class Car(name: String) extends Vehicle
case class Truck(name: String) extends Vehicle
abstract class VehicleContainer[T <: Vehicle]
def compare(that: VehicleContainer[T]): Int
class CarContainer(wheels: Int) extends VehicleContainer[Car]
override def compare(that: CarContainer): Int = ???
这里的目的是在VehicleContainer
上有一个比较方法,可以为VehicleContainer
的每个特定实例定义。 compare
方法比较子句对于每个实例都必须是唯一的,因为它可以使用特定于该实例的属性进行比较,因此未在抽象基类 VehicleContainer
中定义。
问题在于这在当前形式下不起作用,即compare
的覆盖是非法的。我无法理解的是如何实现这一点 - 定义一个基类,指示子类需要实现一个比较方法,其中 compare
方法的方法参数是该子类本身。如果这是我在这里缺少的一些简单的泛型概念,将不胜感激。
谢谢!
【问题讨论】:
你为什么不写override def compare(that: VehicleContainer[Car]): Int
呢?
如果我这样做,我就无法让这样的事情发挥作用 - override def compare(that: VehicleContainer[Car]): Int = this.wheels - that.wheels
def compare[K <: VehicleContainer[T]](that: K): Int
和可能使用traits
好的,@JaiPrabhu。我不知道VehicleContainer
是什么,但您显然承诺可以将一个与另一个(相同类型)进行比较。所以你需要兑现这个承诺。如果这意味着实现def compare(that: VehicleContainer[Car])
只是为了在that
不是CarContainer
时抛出异常,那就这样吧。我觉得这里真正的问题是缺乏这些类的含义的文档,没有它就不清楚实现需要是什么。
如果我继续我的逻辑,你应该从VehicleContainer
中删除compare
方法,因为你不打算提供它。但是VehicleContainer
类型本身没有添加任何内容,所以也不妨删除它。所以你真的在寻找CarContainer
来实现像java.lang.Comparable
这样的特征。
【参考方案1】:
解决问题的一种方法是使用F-bounded polymophism。你只需要一个额外的类型参数:
abstract class Vehicle
val name: String
case class Car(name: String) extends Vehicle
case class Truck(name: String) extends Vehicle
abstract class VehicleContainer[T <: Vehicle, V <: VehicleContainer[T, V]]
def compare(that: V): Int
class CarContainer(wheels: Int) extends VehicleContainer[Car, CarContainer]
override def compare(that: CarContainer): Int = ???
【讨论】:
以上是关于Scala中泛型类型之间的比较的主要内容,如果未能解决你的问题,请参考以下文章