2015-04-30 83 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]