对范围的限制

时间:2011-07-25 18:22:37

标签: scala scala-collections

我很惊讶。为什么限制实现类型为Range,其大小是否受Int.MaxValue限制? 感谢。

2 个答案:

答案 0 :(得分:5)

来自NumericRange docs

  

NumericRangeRange类的更通用版本   任意类型。它必须提供Integral   范围类型的实现。

     

可能类型的工厂包括Range.BigIntRange.Long和   Range.BigDecimalRange.Int存在完整性,但基于Int   scala.Range应该更高效。

val r1 = new Range(0, 100, 1)
val veryBig = Int.MaxValue.toLong + 1
val r2 = Range.Long(veryBig, veryBig + 100, 1)
assert(r1 sameElements r2.map(_ - veryBig))

答案 1 :(得分:0)

在我看来,另一个答案是错误的。

它演示了您可以使用其他数字类型,但这不会改变Range只能保存2³¹元素的事实,就像Scala / Java中的每个其他集合一样。

据我所知,这个设计决定背后没有真正的理由。拥有64位集合肯定会很好,对于具有64位索引的数组的支持在Java中很常见,但很难将它集成到现有的语言/集合框架中。有人说JVM仅限于40亿个对象,但我无法验证。