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バインドされたクラスは、基本クラスではなくバインドされたクラスを比較するのではComparable[T]
なく、拡張する必要がありますComparable[IpAddress[T]]
。
sealed trait IpAddress[T <: IpAddress[T]] extends Comparable[T] {
val address: Array[Byte]
override def compareTo(that: T): Int = ???
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加