2015-04-30 148 views
0

給定的情況下,類是這樣的:斯卡拉訂購[T]和序列化

case class KVPair[ 
    K <: Ordering[K] with Serializable, 
    VV <: Serializable 
](key: K, value: VV) 

我如何去構建一個KVPairLongs,像這樣:

def createKVPair(): KVPair[Long, Long] = { 
    KVPair(1L, 1L) 
} 

編譯器不斷抱怨與:

長不符合方法申請的類型參數範圍。

+0

我認爲這是因爲'長'不是'訂購'。你嘗試過'K <%Comparable'嗎? –

+0

我相信B. Kemmer是對的。 Long是按定義排序的,Ordering從Serializable繼承。這是超越我爲什麼這不起作用。 –

+0

的確如此。所以龍不會延長訂購 –

回答

3

有2件事情在這裏。首先Long不延伸Ordering[Long]The page you linked from the docs在註釋中是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 
) 

你可以閱讀更多關於this answer的上下文邊界和視圖邊界。

2

scala.Long不是Ordering。類型綁定K <: Ordering[K]意味着K應該以Ordering類型爲界。而scala.Long絕對不會延伸類型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]