2011-05-21 8 views
8

Esto no funciona:¿Por qué no puedo crear una matriz de tipo genérico?

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

Pero esto hace:

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

Estoy seguro de que esto es algo bastante básico y sé que las matrices pueden comportarse un poco inusual en Scala.

¿Podría alguien explicarme cómo crear una matriz así y por qué no funciona en primer lugar?

Respuesta

17

Esto se debe al borrado de tipo JVM. Manifiesto eran introducir a manejar esto, hacen que la información del tipo que se debe adjuntar a la T. Este tipo de compilará:

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

hay casi duplica en esto. Déjame ver si puedo desenterrar. Ver http://www.scala-lang.org/docu/files/collections-api/collections_38.html para más detalles. Cito (reemplace evenElems con elem en su caso)

Lo que se necesita aquí es que debes ayudar al compilador a cabo proporcionando algún indicio de tiempo de ejecución lo que el parámetro de tipo real de evenElems es

En particular también puedes usar ClassManifest.

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

preguntas similares:

+0

supuse que se le pidió muchas veces antes, pero no pude encontrar nada. Gracias por responder de nuevo :) –

+0

Oh, nunca respondí esto antes. Le hice la misma pregunta hace un tiempo :) Creo que en este caso, con el tiempo habrás tropezado si buscáis con "scala" y el mensaje de error. – huynhjl

+3

Para ser más precisos, esto se debe a que 'T' se borra pero las matrices _no son_. De nota también, 'ClassManifest' es más rápido. –

Cuestiones relacionadas