从scala-2.10.4的array.scala中,Array被定义为
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()
}
请注意,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
}
我知道有一个隐式参数,它是 ClassTag[T],令我惊讶的是下面这行代码:
new Array[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());
...
}
我对这种翻译方式感到非常困惑,它的规则是什么?
谢谢 张
ClassTag[T]
具有一个名为newArray
的方法,用于创建新的Array[T]
。 - Peter NeyensManifest[T]
的第一行(ClassTag[T]
的子类):“_它的支持使用是为了以Class实例的形式访问类型的擦除,如果在编译时不知道类,则必须这样做才能创建本机数组._” - Peter Neyens