Scala,F-Bounded 多态性没有按预期工作

Scala, F-Bounded polymorphism not working as expected

我有以下 类 与 IpAddresses 相关。我这样定义 IpAddress 是因为我想强制 IpAddress 的每个子类型只能与其自身进行比较。意思是,将 Ipv4 与 Ipv6

进行比较毫无意义
sealed trait IpAddress[T <: IpAddress[T]] extends Comparable[IpAddress[T]] {
  val address: Array[Byte]

  override def compareTo(that: IpAddress[T]): Int = ???
}

case class Ipv4Address(address: Array[Byte]) extends IpAddress[Ipv4Address]{
  assert(address.length == 4)
}

case class Ipv6Address(address: Array[Byte]) extends IpAddress[Ipv6Address]{
  assert(address.length == 16)
}

现在我正尝试在不同的上下文中使用 IpAddress,如下所示:

def doSomethingWithComparables[K <: Comparable[K]](k: K): Int = k.compareTo(k)

但由于某些原因,我无法在此处使用 IpAddress。

doSomethingWithComparables(Ipv4Address(Array(0,0,0,0)))

我收到这个错误:

Error: inferred type arguments [main.Main.Ipv4Address] do not conform to method doSomethingWithComparables's type parameter bounds [K <: Comparable[K]]

有没有人对此有任何想法?

你的 F-bound class 需要扩展 Comparable[T] 而不是 Comparable[IpAddress[T]] 所以你比较的是绑定 class 而不是基础 class:

sealed trait IpAddress[T <: IpAddress[T]] extends Comparable[T] {
  val address: Array[Byte]

  override def compareTo(that: T): Int = ???
}