webentwicklung-frage-antwort-db.com.de

Scala generische Methode - Für T ist kein ClassTag verfügbar

Ich bin relativ neu in Scala und versuche, eine generische Objektmethode zu definieren. Wenn ich mich jedoch auf den parametrisierten Typ innerhalb der Methode beziehe, erhalte ich "No ClassTag available for T". Hier ist ein ausgedachtes Beispiel, das das Problem veranschaulicht.

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)
                                                                        ^

Vielen Dank im Voraus für die Hilfe, um zu verstehen, was hier falsch ist und wie dieses erfundene Beispiel funktioniert.

57
Chuck

Um ein Array in einem generischen Kontext zu instanziieren (Instanziieren eines Arrays von T, wobei T ein Typparameter ist), muss Scala zur Laufzeit Informationen über T, in Form eines impliziten Wertes vom Typ ClassTag[T]. Konkret muss der Aufrufer Ihrer Methode diesen ClassTag - Wert (implizit) übergeben, was bequem über einen kontextgebundenen Wert erfolgen kann. :

def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value)

Eine (ausführliche) Beschreibung dieser Situation finden Sie in diesem Dokument:

http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html

(Um es kurz zu machen, ClassTags sind die überarbeitete Implementierung von ClassManifests, daher bleibt das Grundprinzip bestehen.)

71