[英]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.