2

Scala の Guavas Rangeを使用したいと思います。ただし、要素がインターフェイスを実装することを期待していComparableます。だから私は単に使用することはできません

val range = Range.open(4, 5)

orIntを実装していないので。ただし、型クラスがあります。私がこれまでに持っている唯一のアイデアは、ビュー境界を使用することですComparableOrderedOrdering[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は最小限の例にすぎません。実装していないOrderedOrdering範囲内のより複雑な型があります。

4

2 に答える 2

4

にボックス化することを明示的に指定するだけですjava.lang.Integer

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

すべての呼び出しでこれを行うのが気に入らない場合は、提案したように呼び出しをラップします。

于 2013-08-06T20:37:22.037 に答える