2012-01-31 17 views
11

Durante il tentativo di fare una mappa a Scala, ho visualizzato il seguente messaggio di errore: oggetto mappa non è un valoreoggetto non è un errore di valore nella scala

Il codice che sto utilizzando è il seguente:

val myStringMap = Map[String, String]("first" -> "A", "second" -> "B", "third" -> "C") 

Sono abbastanza perplesso sul motivo per cui non riesco a creare questa mappa perché dopo aver esaminato la documentazione di Scala, mi sembra che la sintassi del mio codice sia corretta.

+1

Se avvio un REPL e incollo questo codice, funziona correttamente; che non fa per te suggerisce qualcosa sul resto del tuo setup. A quale versione di Scala stai andando incontro, quali importazioni hai ecc. Qualcosa nel contesto probabilmente nasconde l'importazione standard di 'Map' e causa questo problema. – Submonoid

+0

Quale versione di scala? Funziona per me in REPL: 'myStringMap: scala.collection.immutable.Map [String, String] = Map (first -> A, second -> B, third -> C)' in 2.9.0.1 –

+0

stesso, bene in REPL – virtualeyes

risposta

17

Quando si vede l'errore "oggetto non è un valore" Questo significa in genere che il tipo in-campo di applicazione è un tipo Java - probabilmente sta importando java.util.Map portata

scala> Map(1 -> "one") 
res0: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> one) 

Ma

scala> import java.util.Map 
import java.util.Map 

scala> Map(1 -> "one") 
<console>:9: error: object Map is not a value 
       Map(1 -> "one") 
      ^

Ricordare, in scala ogni classe viene fornito con un oggetto complementare (facoltativo) che è un valore. Questo non è vero per le classi Java.

+1

Dire che non sto seguendo una classe integrata ma sto cercando di usare una classe Java. Cosa devo fare per ottenere quell'oggetto * companion * ?. – tutuca

+7

Non capisco la soluzione. Quindi, come risolverlo? :) –

1

Ho ottenuto un errore simile nelle liste. provare questo in console Scala:

import java.util.List object test { def a():List[String] = { val list = List[String](); null }}

otterrai i err "Object List is not a value."

Hai capito perché si sta nascondendo la tipo di lista built-in, è perché List è diverso da Java. util.Lista

E se qualcuno volesse utilizzare util.Lista?

è possibile utilizzare un nome qualificato o un'importazione ridenominazione

! import java.util. {list => JList}

import java.util. {list => JList}

+0

Questo non funziona per me – Paul

1

appena trovato questo quindi forse sarà utile per condividere la mia soluzione. Se hai importato java.util.Map e la necessità di utilizzare scala.collection.immutable.Map quindi utilizzarlo con il nome completo così invece di

Map(1 -> "one") 

fare

scala.collection.immutable.Map(1 -> "one") 

questo modo sarà so cosa intendi

0

Perché in scala ogni classe di scala nativa viene fornita con un oggetto complementare (facoltativo) (che consente l'assegnazione dall'oggetto associato come nel codice di esempio) quando si incorpora una classe java in codice scala ricordarsi sempre di istanziare il classe di i invocando il costruttore, es. usa la parola chiave "nuovo", creando così un valore.

+0

Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/18617485) –

Problemi correlati