为什么 ArrayBuilder 基类不提供方法接口?



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
}
  1. 在引入ClassTag之前,创建新数组的方法不能抽象到"泛型类型参数T";之后他们可以,但它会失去性能(在大多数情况下可能非常轻微,但经常调用此代码......

  2. 类型擦除与数组的交互方式很奇怪。您在ArrayBuilder[T]中的任何Array[T]最终都会被Array[AnyRef]。因此,如果你在那里只有抽象方法,像ofFloat这样的类最终会得到很多隐藏的强制转换,JIT 可能会也可能不会优化这些强制转换。

相关内容

最新更新