2010-08-13 2 views

Répondre

10

ajouter simplement un contexte lié ClassManifest à votre déclaration de méthode:

def reverse[T : ClassManifest](a: Array[T]): Array[T] = ... 

Afin de construire un tableau, doit être connue au moment de la compilation du béton de type tableau. Ce type est fourni par le compilateur via un paramètre ClassManifest implicite. Autrement dit, la signature du constructeur Array est en fait

Array[T](size: Int)(implicit m: ClassManifest[T]): Array[T] 

Pour fournir ce paramètre, il doit y avoir une ClassManifest portée lorsque le constructeur Array est invoqué. Par conséquent, votre méthode inverse doit également prendre un paramètre ClassManifest implicite:

def reverse[T](a: Array[T])(implicit m: ClassManifest[T]): Array[T] = ... 
// or equivalently 
def reverse[T : ClassManifest](a: Array[T]): Array[T] = ... 

Cette dernière, notation plus simple est appelée context bound.

+0

On peut utiliser 'Manifest' au lieu de' ClassManifest' dans le contexte lié. Quelle est la différence? –

+0

Bonne question. Juste essayer de comprendre la même chose moi-même :-) –

+0

Il semble que Manifest est un alias de type pour scala.reflect.Manifest, qui n'est pas documenté dans ScalaDoc (peut-être parce que c'est la magie du compilateur?). Pour cette raison, j'aurais tendance à préférer ClassManifest juste pour plus de clarté –

2

Lorsque vous utilisez [T: ClassManifest] si elle est présentée comme l'utilisation désapprouvée [T: ClassTag]

Questions connexes