【发布时间】:2013-08-07 21:43:46
【问题描述】:
我想使用来自 Scala 的 Guavas Range。然而,它希望元素实现Comparable 接口。所以我不能简单地使用
val range = Range.open(4, 5)
因为Int 没有实现Comparable 或Ordered。但是有一个Ordering[Int] 类型的类。到目前为止我唯一的想法是使用视图边界
def open[T](from:T, to:T)(implicit ord: T => Ordered[T]) = Range.open(ord(from), ord(to))
但我获得了 CCE:
val range = open(4,5) //> java.lang.ClassCastException: scala.runtime.RichInt cannot be cast to java.l
//| ang.Integer
//| at scala.runtime.BoxesRunTime.unboxToInt(BoxesRunTime.java:106)
//| at scala.math.Ordering$Int$.compare(Ordering.scala:256)
//| at scala.runtime.OrderedProxy$class.compare(ScalaNumberProxy.scala:71)
//| at scala.runtime.RichInt.compare(RichInt.scala:15)
//| at scala.math.Ordered$class.compareTo(Ordered.scala:91)
//| at scala.runtime.RichInt.compareTo(RichInt.scala:15)
//| at com.google.common.collect.Range.compareOrThrow(Range.java:711)
//| at com.google.common.collect.Cut.compareTo(Cut.java:75)
//| at com.google.common.collect.Range.<init>(Range.java:364)
//| at com.google.common.collect.Range.create(Range.java:156)
//| at com.google.common.collect.Range.open(Range.java:168)
为什么这会导致 ClassCastException?
有没有更好的方法来做到这一点?注意:使用Int 只是一个最小的例子。我有更复杂的类型,它们没有实现Ordered,但在范围内有Ordering。
【问题讨论】:
标签: scala collections guava