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 &lt;: 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中泛型类型之间的比较的主要内容,如果未能解决你的问题,请参考以下文章

将泛型值推送到 Typescript 中泛型类中的泛型列表

Scala中泛型类型的模式匹配

java中啥叫泛型??

java中啥是泛型,怎么用泛型?

对泛型编程中泛型类型的一些理解

Java中泛型的理解