2013-06-04 15 views
47

Jestem względnie nowy w Scala i próbuję zdefiniować metodę obiektu ogólnego. Jednakże, kiedy odwołuję się do sparametryzowanego typu w metodzie otrzymuję "Brak ClassTag dostępny dla T". Oto przykład, który ilustruje problem.Metoda ogólna Scala - brak ClassTag dostępny dla T

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

Z góry dziękujemy za pomoc w zrozumieniu, co jest nie tak i jak sprawić, aby ten wymyślony przykład działał.

Odpowiedz

59

do wystąpienia tablicę w ramach ogólnego (każdy węzeł tablicę T gdzie T jest parametrem typu A) Scala musi posiadać informacje, w czasie wykonywania o T w postaci utajonego wartości typu ClassTag[T]. Konkretnie, trzeba rozmówcę swojej metody do (domyślnie) przekazać tę wartość ClassTag, które mogą być łatwo zrobić za pomocą kontekstu związany:

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

za (dokładnego) opis tej sytuacji, to zobaczyć dokument:

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

(Mówiąc krótko, ClassTags są przerobione realizacja ClassManifests, więc uzasadnienie pozostaje)

+8

Fascynujące. Dzięki "import scala.reflect.ClassTag" to działa. Dzięki. – Chuck

+3

Ludzie mogą znaleźć to pouczające - http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html - ponieważ ClassManifests znikają. – Chuck

+0

Jeśli dokonamy porównania dwóch wartości typu T w treści funkcji, potrzebujemy parametru 'implicit' orderer w uzupełnieniu do adnotacji' ClassTag'. – AlvaPan

Powiązane problemy