我正在尝试使用DateTime(joda)使用> =,>等,而我能让它工作的唯一方法就是使用这种隐式转换
implicit def dateTime2ordered(x: DateTime): Ordered[DateTime] =
new Ordered[DateTime] with Proxy {
val self = x
def compare(y: DateTime): Int = {
x.compareTo(y)
}
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢更通用的形式,如
implicit def comparable2ordered[A <: Comparable[A]](x: A): Ordered[A] =
new Ordered[A] with Proxy {
val self = x
def compare(y: A): Int = {
x.compareTo(y)
}
}
Run Code Online (Sandbox Code Playgroud)
但是编译器找不到这种转换,并且在尝试直接调用它之后,我得到了以下消息,声称DateTime不是Comparable类型[A].在检查DateTime的源代码后,我看到它只将Comparable实现为原始类型.
我能够使用它
implicit def comparable2ordered[A <: Comparable[_]](x: A): Ordered[A] =
new Ordered[A] with Proxy {
val self = x
def compare(y: A): Int = {
x.compareTo(y)
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:这是对此问题的正确Scala处理,还是通配符类型绑定会导致类型检查的未来问题?
我偶然发现了这个问题,因为我也希望使用关系运算符来比较joda DateTime对象.
丹尼尔的回答指出了我正确的方向:存在的含义scala.math.Ordered将把一个实例转换A extends java.lang.Comparable[A]成一个Ordered[A]- 它们只需要被纳入范围.最简单的方法(我在这里学到的,顺便说一下)是用这个implicitly方法:
val aOrdering = implicitly[Ordering[A]]
import aOrdering._
Run Code Online (Sandbox Code Playgroud)
捕获的是org.joda.time.DateTime不扩展或实现Comparable自身,它继承(间接)org.joda.time.ReadableInstant,确实扩展Comparable.所以这:
val dateTimeOrdering = implicitly[Ordering[DateTime]]
import dateTimeOrdering._
Run Code Online (Sandbox Code Playgroud)
不会编译,因为DateTime不会扩展Comparable[DateTime].要Ordered在a上使用关系运算符DateTime,您必须这样做:
val instantOrdering = implicitly[Ordering[ReadableInstant]]
import instantOrdering._
Run Code Online (Sandbox Code Playgroud)
这是因为ReadableInstant扩展Comparable[ReadableInstant],并且隐式转换Ordered可以将其转换为Ordered[ReadableInstant].
到现在为止还挺好.但是,有些情况下Ordered[ReadableInstant]不够好.(我遇到的那个是ScalaTest 比Matchers更大而且更少.)为了得到一个Ordered[DateTime],我被迫这样做:
implicit object DateTimeOrdering extends Ordering[DateTime] {
def compare(d1: DateTime, d2: DateTime) = d1.compareTo(d2)
}
Run Code Online (Sandbox Code Playgroud)
似乎应该有一种更简单的方法,但我无法想出一个.
没问题,原始类型“Comparable”在 Scala 中被转换为“Comparable[_]”。
它们被称为存在类型,Comparable[_] 是“ Comparable[T] forSome { type T } ”的简写(从版本 2.7 开始,请参见http://www.scala-lang.org/node/43)
另请参阅http://www.artima.com/scalazine/articles/scalas_type_system.html中的“存在类型”
| 归档时间: |
|
| 查看次数: |
2399 次 |
| 最近记录: |