2010-08-07 5 views
7

Voici un extrait du code-java.util.concurrent.LinkedBlockingQueue méthode proposée ne nécessite rien comme argument dans Scala

import java.util.concurrent.LinkedBlockingQueue 

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

Cela me donne -

erreur: incompatibilité de type;
trouvé: java.lang.String ("foo")
requis: Rien
queue.add ("foo")

Ma compréhension est la cause de moi de ne pas préciser le type des éléments entrant dans la queue. Si c'est le cas, comment spécifier les types dans scala pour LinkedBlockingQueue au lieu des types génériques par défaut?

+0

Notez que le type par défaut est générique. _not_ Au lieu de cela, c'est le type le plus spécifique possible. :-) –

Répondre

3

Lorsque vous ne fournissez pas une signature de type mais est nécessaire, Scala utilise Scala choisit LinkedBlockingQueue[Nothing].

la signature la plus restrictive possible. (! on ne peut rien Nothing) Étant donné que Nothing est la plus restrictive de tous mais dans ce cas, le caractère restrictif signifie que vous ne pouvez pas réellement pu rien dans cette file d'attente très restrictive.

Comme vous l'avez déjà découvert, la solution est de préciser le type de classes dans la collection:

val queue = new LinkedBlockingQueue[String] 

Mais notez que le inferencer de type peut comprendre le type dans d'autres cas, en suivant la " aussi restrictive que possible ". Par exemple, si initial est une autre collection Java qui est tapé comme contenant des chaînes,

val queue = new LinkedBlockingQueue(initial) 

serait tout simplement travailler, comme il lirait hors du type String de initial.

1

J'ai bien deviné. Le type doit être spécifié comme indiqué -

val queue=new LinkedBlockingQueue[String] 
1

Java types premières sont une concession à la compatibilité ascendante et leur utilisation mauvais style considéré. Dans Scala, vous n'avez pas de types bruts, vous devez donc les spécifier ou le type inferencer doit être capable de les déduire. Notez que vous pouvez spécifier le type paramétrique sur le côté gauche aussi.

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

Cela fait ici pas beaucoup de sens, mais est important si vous voulez avoir un autre type (par exemple Queue[String] pour votre variable

Questions connexes