2011-05-21 21 views
8

To nie działa:Dlaczego nie mogę utworzyć tablicy typu ogólnego?

def giveArray[T](elem:T):Array[T] = { 
    new Array[T](1) 
    } 

Ale to robi:

def giveList[T](elem:T):List[T] = { 
    List.empty[T] 
    } 

Jestem pewien, że jest to dość podstawowe rzeczy i wiem, że Tablice mogą zachowywać się nieco nietypowe Scala.

Czy ktoś mógłby mi wytłumaczyć, jak stworzyć taką tablicę, a także dlaczego nie działa?

Odpowiedz

17

Jest to spowodowane usunięciem typu maszyny JVM. Oczywista była przedstawić sobie z tym poradzić, powodują one informacje o typie być dołączone do typu T. Będzie to skompilować:

def giveArray[T: Manifest](elem:T):Array[T] = { 
    new Array[T](1) 
} 

Istnieje prawie powielane pytania na ten temat. Zobaczę, czy uda mi się wykopać. Aby uzyskać więcej informacji, patrz http://www.scala-lang.org/docu/files/collections-api/collections_38.html. Cytuję (zastąpić evenElems z elem w Twoim przypadku)

co jest wymagane tutaj jest to, że pomaga kompilatora przez zapewniając pewną wskazówkę wykonania co rzeczywisty parametr typ evenElems jest

W szczególności możesz również użyć ClassManifest.

def giveArray[T: ClassManifest](elem:T):Array[T] = { 
    new Array[T](1) 
} 

Podobne pytania:

+0

Przypuszczałem, że został poproszony wiele razy wcześniej, ale nie mogłem znaleźć niczego. Dziękuję za odpowiedź ponownie :) –

+0

Och, nigdy nie odpowiedziałem na to wcześniej. Zadałem to samo pytanie jakiś czas temu :) Myślę, że w tym przypadku natknąłbyś się na to, gdybyś szukał z "scala" i komunikatem o błędzie. – huynhjl

+3

Mówiąc dokładniej, dzieje się tak dlatego, że 'T' jest wymazywane, ale tablice _ to nie_. Warto również zauważyć, że "ClassManifest" jest szybszy. –

Powiązane problemy