1

我有以下与 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]]

有人对此有任何想法吗?

4

1 回答 1

3

您的 F 绑定类需要扩展Comparable[T],而不是Comparable[IpAddress[T]]比较绑定类而不是基类:

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

  override def compareTo(that: T): Int = ???
}
于 2019-08-24T10:47:43.157 回答