2011-07-25 80 views
1

我很惊讶。为什么要限制执行类型Range,是否由Int.MaxValue限制其大小? 谢谢。限制范围

+0

因为'Range'没有参数化并在内部使用'Int'? 'new Range(start:Int,end:Int,step:Int)' http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Range –

+0

And?很明显,但为什么不使用Long? – dvigal

+0

你能再次检查答案吗? – soc

回答

5

NumericRange docs

NumericRangeRange类任意类型的作品 的更宽泛的版本。它必须提供范围类型的实现Integral

可能类型的工厂包括Range.BigInt,Range.LongRange.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)) 
+0

Imho这并没有回答这个问题是关于允许的大小,而不是关于可以用作元素的类型。 – soc

+0

@soc当然你是对的。在第一优先级我感兴趣的任何原因允许的范围大小2^31。可能原因在于收集设计...... – dvigal

0

在我看来,对方的回答是错误的。

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

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