2014-10-25 13 views
6

Tutto ciò che desidero è utilizzare un insieme concomitante (che sembra non esistere affatto). Java utilizza java.util.concurrent.ConcurrentHashMap<K, Void> per ottenere questo comportamento. Mi piacerebbe fare qualcosa simile a Scala così ho creato un'istanza della Scala HashMap (o Java ConcurrentHashMap) e ho cercato di aggiungere alcune tuple:come istanziare l'unità in Scala?

val myMap = new HashMap[String, Unit]() 
myMap + (("myStringKey", Unit)) 

Questo, naturalmente, si è schiantato il processo della compilazione come unità è astratto e finale .

Come fare questo lavoro? Devo usare Any/AnyRef? Devo assicurarmi che nessuno inserisca alcun valore.

Grazie per l'aiuto

+1

Nota, 'java.util.concurrent.ConcurrentHashMap ' è errato. Il tipo 'Void' (nota' V 'maiuscola) può solo accettare il valore 'null', ma [la documentazione per' ConcurrentHashMap'] (http://docs.oracle.com/javase/7/docs/api/java /util/concurrent/ConcurrentHashMap.html) disabilita specificamente le chiavi/valori 'null' nella mappa. Il modo in cui di solito viene implementato è 'ConcurrentHashMap ', usando costante 'Boolean.TRUE' per i valori. (Usando la costante 'Boolean.TRUE' assicurati di non creare una nuova istanza' Boolean' per ogni voce nella mappa.) – DaoWen

+0

correzione (void -> Void) proceduto, usando 'Boolean.TRUE' è un bel trucco, grazie – petrbel

+0

sei sicuro che dovresti anche usare l'unità? che ne dici di "Opzione" o di un ADT personalizzato (famiglia di classi di case sigillate)? –

risposta

11

Si può semplicemente utilizzare () il cui tipo è Unit:

scala> import scala.collection.mutable.HashMap 
import scala.collection.mutable.HashMap 

scala> val myMap = new HashMap[String, Unit]() 
myMap: scala.collection.mutable.HashMap[String,Unit] = Map() 

scala> myMap + ("myStringKey" ->()) 
res1: scala.collection.mutable.Map[String,Unit] = Map(myStringKey ->()) 

Questo è un commento preso da Unit.scala:

C'è solo un valore di tipo Unit , (), e non è rappresentato da alcun oggetto nel sistema runtime sottostante.

+3

Forse aggiungi che quando dici 'val x =()', quello che ottieni è il valore in box, 'scala.runtime.BoxedUnit.UNIT'. Inoltre, '()' ha tipo Unità: dire "tipo di ritorno" potrebbe confondere le persone a causa dell'uso paren nelle applicazioni di funzione. Il valore unitario sembra una tupla vuota, non una strana applicazione. –

Problemi correlati