Cha*_*ang 3 arrays reflection types scala scala-2.10
从 scala-2.10.4 的 array.scala 中,数组被定义为
final class Array[T](_length: Int) extends java.io.Serializable with java.lang.Cloneable {
/** The length of the array */
def length: Int = throw new Error()
def apply(i: Int): T = throw new Error()
def update(i: Int, x: T) { throw new Error() }
override def clone(): Array[T] = throw new Error()
}
Run Code Online (Sandbox Code Playgroud)
请注意,apply 方法会抛出异常!对于伴随对象 Arrry,我找到以下代码:
def apply[T: ClassTag](xs: T*): Array[T] = {
val array = new Array[T](xs.length)
var i = 0
for (x <- xs.iterator) { array(i) = x; i += 1 }
array
}
Run Code Online (Sandbox Code Playgroud)
我知道有一个隐式参数是ClassTag[T],让我惊讶的是如何
新数组[T] (xs.length)
被编译。通过反编译 Array.class,我发现该行被转换为:
public <T> Object apply(Seq<T> xs, ClassTag<T> evidence$2)
{
// evidence$2 is implicit parameter
Object array = evidence$2.newArray(xs.length());
...
}
Run Code Online (Sandbox Code Playgroud)
我真的被这种翻译弄糊涂了,这里面的规则是什么?
谢谢张