2010-08-07 12 views
7

Aquí hay un fragmento del código-java.util.concurrent.LinkedBlockingQueue puso método requiere Nada como argumento en Scala

import java.util.concurrent.LinkedBlockingQueue 

def main(args:Array[String]) { 
    val queue=new LinkedBlockingQueue 
    queue.put("foo") 
} 

Esto me da -

de error: No coinciden los tipos;
encontrado: java.lang.String ("foo")
requiere: Nada
queue.add ("foo")

Mi opinión es que es porque de mi parte no especifica el tipo de los elementos de entrar en el cola. Si ese es el caso, ¿cómo especificamos los tipos en scala para LinkedBlockingQueue en lugar de los genéricos predeterminados?

+0

Tenga en cuenta que el tipo predeterminado es _No_ genérico. En cambio, es el tipo más específico posible. :-) –

Respuesta

3

Cuando no se proporciona una firma de tipo pero se necesita una, Scala utiliza la firma más restrictiva posible. Desde Nothing es el más restrictivo de todos (nada puede ser Nothing!), Scala elige LinkedBlockingQueue[Nothing].

pero en este caso, la restricción significa que no se puede en realidad pu t cualquier cosa en esta cola altamente restrictiva.

Como ya has descubierto, la solución es especificar el tipo de clases en la colección:

val queue = new LinkedBlockingQueue[String] 

Pero tenga en cuenta que el tipo inferencer puede averiguar el tipo correcto en otros casos, siguiendo el " lo más restrictivo posible "regla. Por ejemplo, si initial es otra colección de Java que se escribe como cadenas que contienen,

val queue = new LinkedBlockingQueue(initial) 

sería sólo el trabajo, ya que leer el tipo de Stringinitial.

1

Supuse correcto. El tipo debe ser especificado como se muestra -

val queue=new LinkedBlockingQueue[String] 
1

Java tipos primas son una concesión a la compatibilidad con versiones anteriores y su uso considerado mal estilo. En Scala no tiene tipos brutos, por lo que debe especificarlos o el tipo inferencer debe poder inferirlos. Tenga en cuenta que puede especificar el tipo paramétrico en el lado izquierdo, también:.

val queue:LinkedBlockingQueue[String] = new LinkedBlockingQueue() 

Eso hace que aquí no tiene mucho sentido, pero es importante si usted quiere tener un tipo diferente (por ejemplo Queue[String] para la variable de

Cuestiones relacionadas