Scala Ordered / Java Comparable互操作性

时间:2014-05-21 21:42:39

标签: scala scala-java-interop

我正在尝试在Scala中实现相当于Guava的RangeSet(我需要Guava的RangeSet的其他功能,例如快速交集和完全不可变的实现)。但是,我想继续使用Guava的Range类,因为它相当完整,从头开始重写Scala会很麻烦(BTW,这将是Scala标准的一个很好的补充)库)。

但是,我坚持使用Ordered / Comparable互操作性,尤其是在使用类型边界时。 Scala的惯用语[A < Ordered[A]]与Guava的[C <: Comparable[_]]兼容,但它不会使用[A <% Ordered[A]]等更奇特的类型边界,这是必需的使用标准类型,如Ints(当然这是我的主要用例)

总之,如何编写如下的编译?

import com.google.common.collect.{ Range => GuavaRange }
def closed[A <% Ordered[A]](l: A, u: A) = GuavaRange.closed(l, u)

目前,我收到以下错误:inferred type arguments [A] do not conform to method closed's type parameter bounds [C <: Comparable[_]]

<%编译替换<:运算符,但该函数将不再接受Ints。

1 个答案:

答案 0 :(得分:2)

A的参数closed成为传递给GuavaRange的类型参数,因此它必须是子类型ComparableOrderedComparable[A <: Ordered[A]]<%很好但A只声明了一个视图限制,并且不能保证Comparable将是Ordered },仅存在转化为Comparable / GuavaRange的费用。

您无法创建Int类型Int,因为Comparable未实施Int。自动装箱时,java.lang.Integer实际上是Comparable,但编译器仍然不允许您将其视为java.lang.Integer。您必须在:

之间进行选择
  1. Comparable。这确实实现了Ordered,但不是Int。它与scala.runtime.RichInt之间存在隐式转换。
  2. Int当您隐式地将Ordered转换为Int时,这就是您所获得的。与Ordering进行隐式转换。
  3. 你自己的包装。
  4. 构建类似这样的类的惯用Scala方法是使用Range实例,但这会阻止您使用Guava的Comparable,除非您添加一个额外的框围绕一切(即将它们包裹在委托给Ordering的{​​{1}}中)。