2011-05-21 9 views
8

Questo non funziona:Perché non posso creare un array di tipo generico?

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

Ma questo fa:

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

Sono sicuro che questa è una cosa piuttosto semplice e so che array possono comportarsi un po 'insolito a Scala.

Qualcuno potrebbe spiegarmi come creare un array di questo tipo e anche perché non funziona in primo luogo?

risposta

17

Ciò è dovuto alla cancellazione del tipo JVM. Manifesto erano introdurre per gestire questa situazione, che provocano le informazioni sul tipo da allegare al tipo T. Questo compilerà:

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

Ci sono quasi duplicati su questo. Fammi vedere se riesco a scavare. Vedere http://www.scala-lang.org/docu/files/collections-api/collections_38.html per ulteriori dettagli. Cito (sostituire evenElems con elem nel tuo caso)

Ciò che è necessario è che si aiuta il compilatore out, fornendo qualche suggerimento runtime ciò che il parametro di tipo effettivo di evenElems è

In particolare puoi anche usare ClassManifest.

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

domande simili:

+0

ho pensato che è stato chiesto molte volte prima, ma non ho trovato nulla. Grazie per aver risposto di nuovo :) –

+0

Oh non ho mai risposto prima. Ho chiesto la stessa domanda qualche tempo fa :) Penso che in questo caso alla fine ci si sarebbe imbattuti in caso avessi cercato con "scala" e il messaggio di errore. – huynhjl

+3

Per essere più precisi, questo è dovuto al fatto che 'T' viene cancellato ma gli array _ non sono_. Di nota anche, 'ClassManifest' è più veloce. –

Problemi correlati