簡體   English   中英

Scala排序[T]和可序列化

[英]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隱式可見,在這里您可能會感興趣。 您可以使用視圖綁定來確保KV具有此約束:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM