【问题标题】:Scala Ordering[T] and SerializableScala 排序[T] 和可序列化
【发布时间】:2015-04-30 12:36:04
【问题描述】:

给定一个这样的案例类:

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 不符合方法 apply 的类型参数界限。

【问题讨论】:

  • 我认为这是因为Long 不是Ordering。你试过K &lt;% Comparable吗?
  • 我相信 B. Kemmer 是对的。 Long 是根据 Ordering 的定义,而 Ordering 继承自 Serializable。我无法理解为什么这不起作用。
  • 确实如此。 So Long 不扩展 Ordering

标签: scala


【解决方案1】:

这里发生了两件事。首先Long 不扩展Ordering[Long]。 cmets 中的The page you linked from the docsscala.math.Ordering 包中名为Long 的隐式对象的文档。

但是,该对象在这里非常相关。由于该对象在隐式范围内,您可以使用 上下文绑定 来确保有一个可用的 Ordered[Long] 实例,这将允许代码订购您的 Longs

case class Key[K : Ordering](key: K)

这将允许您执行Key(1L)

你的另一个问题是Long也不是Serializable,所以第二个泛型参数也有问题。 Long 可以隐含地视为java.io.Serializable,您可能会对这里感兴趣。您可以使用 view bound 来确保 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 &lt;: 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类是语法糖:

    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]
    

    【讨论】:

      猜你喜欢
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 2010-12-29
      • 1970-01-01
      • 2011-12-05
      • 2017-02-20
      • 1970-01-01
      相关资源
      最近更新 更多