ArrayBuilder 没有方法定义:
abstract class ArrayBuilder[T] extends ReusableBuilder[T, Array[T]] with Serializable
然而,它的实现通常会共享具有相同接口的方法,直到泛型类型参数T
(以mkArray
为例(:
final class ofFloat extends ArrayBuilder[Float] {
//...
private def mkArray(size: Int): Array[Float] = {
val newelems = new Array[Float](size)
if (this.size > 0) Array.copy(elems, 0, newelems, 0, this.size)
newelems
}
-
在引入
ClassTag
之前,创建新数组的方法不能抽象到"泛型类型参数T
";之后他们可以,但它会失去性能(在大多数情况下可能非常轻微,但经常调用此代码...... -
类型擦除与数组的交互方式很奇怪。您在
ArrayBuilder[T]
中的任何Array[T]
最终都会被Array[AnyRef]
。因此,如果你在那里只有抽象方法,像ofFloat
这样的类最终会得到很多隐藏的强制转换,JIT 可能会也可能不会优化这些强制转换。