2010-08-07 12 views
7

Ecco un frammento del code-java.util.concurrent.LinkedBlockingQueue messo metodo richiede Nulla come argomento a Scala

import java.util.concurrent.LinkedBlockingQueue 

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

Questo mi dà -

errore: tipo non corrispondente;
trovati: java.lang.String ("foo")
richiesto: Niente
queue.add ("foo")

La mia comprensione è la sua causa mia non specifica il tipo degli elementi di entrare in coda. Se è così, come possiamo specificare i tipi in scala per LinkedBlockingQueue al posto di quelli generici di default?

+0

Nota che il tipo di default è _not_ generica. Invece, è il tipo più specifico possibile. :-) –

risposta

3

Quando non si specifica una firma tipo, ma uno è necessario, Scala usa la firma più restrittivo possibile. Dal momento che Nothing è il più restrittivo di tutti (niente può essere Nothing!), Scala sceglie LinkedBlockingQueue[Nothing].

ma in questo caso, la restrizione significa che non si può effettivamente fare nulla in questa coda altamente restrittiva.

Come hai già scoperto, la soluzione è quella di specificare il tipo di classi nella collezione:

val queue = new LinkedBlockingQueue[String] 

Ma nota che il tipo inferencer riesce a capire il tipo giusto in altri casi, seguendo la " regola "più restrittiva possibile". Per esempio, se initial è un'altra collezione di Java che viene digitato come contenente le stringhe,

val queue = new LinkedBlockingQueue(initial) 

sarebbe solo lavorare, come sarebbe leggere il tipo String da initial.

1

Ho indovinato. Il tipo deve essere specificato come mostrato -

val queue=new LinkedBlockingQueue[String] 
1

I tipi grezzi Java sono una concessione alla compatibilità a ritroso e il loro utilizzo è considerato di cattivo gusto. In Scala non hai tipi non elaborati, quindi devi specificarli o il tipo di inferenza deve essere in grado di dedurli. Si noti che è possibile specificare il tipo parametrico a sinistra, anche:.

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

Che fa qui non ha molto senso, ma è importante se si vuole avere un diverso tipo (ad esempio Queue[String] per la variabile

Problemi correlati