2017-08-12 1 views
0

ArrayBuilder n'a pas de définition de la méthode:Pourquoi la classe de base ArrayBuilder ne fournit pas d'interfaces de méthode?

abstract class ArrayBuilder[T] extends ReusableBuilder[T, Array[T]] with Serializable 

Cependant, les implémentations de celui-ci seront généralement des méthodes de partage avec la même interface, jusqu'à l'argument de type générique T (en mkArray comme exemple):

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 
    } 

Répondre

1
  1. Les méthodes créant de nouveaux tableaux ne pouvaient pas être abstraites "jusqu'à l'argument de type générique T" avant que ClassTag s aient été introduites; après, ils le pouvaient, mais ils perdraient de la performance (probablement très légèrement dans la plupart des cas, mais ce code est appelé assez souvent ...).

  2. L'effacement de type interagit bizarrement avec des tableaux. N'importe quel Array[T] vous avez dans ArrayBuilder[T] deviendra Array[AnyRef]. Donc, si vous avez juste des méthodes abstraites là, des classes comme ofFloat se retrouveront avec beaucoup de moulages cachés que JIT peut ou non optimiser.