我正在尝试在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。
答案 0 :(得分:2)
A
的参数closed
成为传递给GuavaRange
的类型参数,因此它必须是子类型Comparable
。 Ordered
个Comparable
个[A <: Ordered[A]]
,<%
很好但A
只声明了一个视图限制,并且不能保证Comparable
将是Ordered
},仅存在转化为Comparable
/ GuavaRange
的费用。
您无法创建Int
类型Int
,因为Comparable
未实施Int
。自动装箱时,java.lang.Integer
实际上是Comparable
,但编译器仍然不允许您将其视为java.lang.Integer
。您必须在:
Comparable
。这确实实现了Ordered
,但不是Int
。它与scala.runtime.RichInt
之间存在隐式转换。Int
当您隐式地将Ordered
转换为Int
时,这就是您所获得的。与Ordering
进行隐式转换。构建类似这样的类的惯用Scala方法是使用Range
实例,但这会阻止您使用Guava的Comparable
,除非您添加一个额外的框围绕一切(即将它们包裹在委托给Ordering
的{{1}}中)。