С array.scala из-2.10.4 лестницу, The Массив определяется какчто магия Скала Array.apply
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()
}
Обратите внимание, что метод применяется сгенерирует исключение! А для сопровождения объекта 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], что делает меня удивляйтесь то, как
новый массив [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]'] (http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.reflect.ClassTag) имеет метод 'newArray' который создает новый 'Array [T]' –
@PeterNeyens, я знаю, что существует метод newArray, но я не знаю, почему newArray выбран путем компиляции – Chang
Цитируя первую строку [Manifest [T] '] (http : //www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.reflect.Manifest) (подкласс класса ClassTag [T] '):" _Its поддерживается использование, чтобы дать доступ к стиранию типа как экземпляра класса, как это необходимо для создания собственных массивов, если класс неизвестен во время компиляции. « –