[英]Scala Ordering[T] and Serializable
给定这样的案例类:
case class KVPair[
K <: Ordering[K] with Serializable,
VV <: Serializable
](key: K, value: VV)
我将如何与Longs
一起构建KVPair
,如下所示:
def createKVPair(): KVPair[Long, Long] = {
KVPair(1L, 1L)
}
编译器不断抱怨:
Long不符合方法应用的类型参数范围。
这里有两件事。 首先, Long
不扩展Ordering[Long]
。 您从注释中的文档链接到的页面是scala.math.Ordering
包中一个名为Long
的隐式对象的文档。
但是,该对象在这里非常重要。 由于该对象处于隐式范围内,因此可以使用上下文绑定来确保有一个Ordered[Long]
实例可用,这将允许代码对Longs
进行排序。
case class Key[K : Ordering](key: K)
这将允许您执行Key(1L)
。
您的另一个问题是Long
也不可Serializable
,因此第二个通用参数也是有问题的。 Long
作为java.io.Serializable
隐式可见,在这里您可能会感兴趣。 您可以使用视图绑定来确保K
和V
具有此约束:
type JS = java.io.Serializable
case class KVPair[K <% JS : Ordering, V <% JS](key: K, value: V)
上下文绑定和视图绑定的语法使其等效于:
case class KVPair[K, V](key: K, value: V)(
implicit kev1: Ordering[K],
kev2: K => JS,
vev1: V => JS
)
您可以在此答案中了解有关上下文范围和视图范围的更多信息。
scala.Long
不是Ordering
。 类型绑定K <: Ordering[K]
表示K
必须由Ordering
类型限制。 而scala.Long
最肯定不会扩展Type类Ordering
。 存在一个Ordering[Long]
的实例,但是scala.Long
不扩展它。
您想要的是Ordering[K]
证据,即上下文绑定 。 像这样:
case class KVPair[K : Ordering , VV](key: K, value: VV)
def createKVPair(): KVPair[Long, Long] = {
KVPair(1L, 1L)
}
上面的案例类是用于以下方面的语法糖:
case class KVPair[K, VV](key: K, value: VV)(implicit ev: Ordering[K])
您可能已经注意到,我还删除了Serializable
绑定。 这是因为Long
不可Serializable
,因此它可能无法使用该约束。
scala> implicitly[Long <:< Serializable]
<console>:26: error: Cannot prove that Long <:< Serializable.
implicitly[Long <:< Serializable]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.