2017-08-12 25 views
0

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
  1. ClassTagが導入された前に、新しい配列を作成するメソッドを「汎用型引数Tまで」抽象化できませんでした。その後は可能ですが、パフォーマンスが低下します(たいていの場合、おそらくごくわずかですが、このコードはかなり頻繁に呼び出されます)。

  2. タイプ消去は、配列と奇妙なやり取りをします。 Array[T]のユーザーがArrayBuilder[T]になると、最終的にArray[AnyRef]になります。したがって、抽象メソッドがあれば、ofFloatのようなクラスは、JITが最適化するかもしれないし、最適化しないかもしれないたくさんの隠れたキャストに終わるでしょう。