Je suis relativement nouveau à Scala et j'essaie de définir une méthode d'objet générique. Cependant, quand je fais référence au type paramétré dans la méthode, j'obtiens "Aucun ClassTag disponible pour T". Ici est un exemple artificiel qui illustre le problème.
scala> def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
<console>:7: error: No ClassTag available for T
def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
^
Merci à l'avance de votre aide pour comprendre ce qui ne va pas ici et comment faire fonctionner cet exemple artificiel.
Pour instancier un tableau dans un contexte générique (instancier un tableau de T
où T
est un paramètre de type), Scala doit avoir des informations à l'exécution sur T
, sous la forme d'une valeur implicite de type ClassTag[T]
. Concrètement, vous avez besoin de l'appelant de votre méthode pour passer (implicitement) cette valeur ClassTag
, ce qui peut être fait commodément en utilisant un lié au contexte :
def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
Pour une description (approfondie) de cette situation, consultez ce document:
http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html
(Pour le dire brièvement, les ClassTags sont l'implémentation retravaillée des ClassManifests, donc la logique demeure)