【问题标题】:Scala, F-Bounded polymorphism not working as expectedScala,F-Bounded多态性未按预期工作
【发布时间】:2019-08-28 13:07:59
【问题描述】:

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

有人对此有任何想法吗?

【问题讨论】:

    标签: scala generics f-bounded-polymorphism


    【解决方案1】:

    您的 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 = ???
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      相关资源
      最近更新 更多