【发布时间】: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这样的特征。
标签: scala inheritance types