scala - 在 Scala 中使用 Guava 范围

标签 scala collections guava

我想使用 Guavas Range来自斯卡拉。但是,它希望元素实现 Comparable 接口(interface)。所以我不能简单地使用

val range = Range.open(4, 5)

因为 Int 没有实现 ComparableOrdered。但是有一个 Ordering[Int] 类型类。到目前为止我唯一的想法是使用 View 边界

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

最佳答案

只需明确指定您要装箱到 java.lang.Integer:

import java.lang.{Integer => jI}
Range.open[jI](3,5)

如果您不喜欢在每次通话时都这样做,请按照您的建议包装通话。

关于scala - 在 Scala 中使用 Guava 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18087729/

相关文章:

java - 如何求和 2 个 joda-time DateTime 值(一个包含日期和零时间,另一个包含时间和零日期)?

java - Guava 函数参数

java - 为什么 Guava 的 Iterables.filter 想要谓词中的父类(super class)?

javascript - 如何将 javascript 数组转换为 scala List 对象

arrays - 如何在 Scala 中获取数组列表中两个元素的总和

Scala:在运行时替换方法

java - 需要高性能 Scala/Java 集合

java - [Java]数组和集合测试,意外的结果?

java - 使用 Java 集合的应用程序

java - 从多重集中删除集合的出现