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 = ???
}
我有以下 类 与 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 = ???
}