2010-02-12 8 views
17

Próbowałem skompilować kod z this SO question i uruchomić ten komunikat o błędzie cannot find class manifest for element type T. Oto kolejny fragment, który pokazuje zachowanie:nie można znaleźć manifestu klasy dla elementu typu T

scala> def f[T](a:T, b:T):Array[T] = { new Array[T](2) } 
<console>:4: error: cannot find class manifest for element type T 
     def f[T](a:T, b:T):Array[T] = { new Array[T](2) } 

widzę, że new collection.mutable.GenericArray[T](2) rozwiązuje ten problem. Podobno dostarczanie manifestu jest inną opcją ... Ale co oznacza "dostarczanie oczywistego środka"?

+1

Należy pamiętać, że nazwa GenericArray została zmieniona na ArraySeq w wersji Scala 2.8. –

Odpowiedz

19

Dostarczenie informacji typu można wykorzystać kontekst związany

def f[T : Manifest](a:T, b:T):Array[T] = { new Array[T](2) } 

lub manifest jako niejawny argument:

def f[T](a:T, b:T)(implicit manifest : Manifest[T]) : Array[T] = { new Array[T](2) } 

pierwsza jest cukier syntaktyczny dla późniejsza. Numer manifest jest potrzebny, ponieważ brakuje informacji o typie T z powodu generycznej maszyny JVM generycznej type errasure.

+0

Niektóre informacje są również podane przez Martina w tym artykule: http://www.scala-lang.org/sites/default/files/sids/cunei/Thu,%202009-10-01,%2013:54/arrays.pdf –

+0

Zobacz także http://stackoverflow.com/questions/3213510/what-is-a-manifest-in-scala-and-when-do-you-eded-it, aby uzyskać więcej informacji na temat manifestów i typu wymazania. –

+0

AFAIK ClassManifest jest w tym przypadku wystarczający. – Landei