2017-10-10 25 views
0

Je suis nouveau à scala et quand je compile mon projet de SBT, je vois cette exception:Type de Cast: Carte [String, String] à Map [String, Object]

[error] C:\dev\reactive-rabbit\src\main\scala\io\scalac\amqp\impl\RabbitConnection.scala:58: type mismatch; 
[error] found : Map[String,String] (in scala.collection.immutable) 
[error] required: Map[String,Object] (in java.util) 
[error]  future(onChannel(_.exchangeBind(destination, source, routingKey, arguments))) 
[error]                 ^

J'ai récemment remplacé la JavaConversions déconseille bibliothèque à JavaConverters. Mon code ressemble à ceci:

import scala.collection.JavaConvertors._ 
override def exchangeBind(destination: String, source: String, routingKey: String, 
         arguments: Map[String, String]) = 
    future(onChannel(_.exchangeBind(destination, source, routingKey, arguments))) 
     .map(_ ⇒ Exchange.BindOk()) 

J'ai regardé le contrat pour onChannel() et son paramètre arguments nécessite de type Map[String, Object] (collections java), mais je passe une carte [String, String] (scala immuable). Comment puis-je changer le type de données pour cet argument en le passant à la méthode? Merci.

Répondre

0

Utilisez JavaConverters au lieu de JavaConversions (il est déconseillés) et aussi la carte Chaîne à l'objet pour éviter l'erreur suivante:

<console>:19: error: type mismatch; 
found : java.util.Map[String,String] 
required: java.util.Map[String,Object] 
Note: String <: Object, but Java-defined trait Map is invariant in type V. 
You may wish to investigate a wildcard type such as `_ <: Object`. (SLS 3.2.10) 
     javaMap = Map[String,String]().asJava 

.

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

import scala.collection.JavaConverters._ 

var javaMap: java.util.Map[String,Object] = new java.util.HashMap() 
javaMap.put("key", "value") 

println(javaMap) 

javaMap = Map[String,String]("new_key" -> "new_value").map{case (k,v) => (k, v.asInstanceOf[Object])}.asJava 

// Exiting paste mode, now interpreting. 

{key=value} 
import scala.collection.JavaConverters._ 
javaMap: java.util.Map[String,Object] = {new_key=new_value} 
javaMap: java.util.Map[String,Object] = {new_key=new_value} 

scala> 
+0

La conversion à l'aide de 'map' n'est pas vraiment nécessaire et prendra juste du temps et de la mémoire. –

1

Scala est Map paramètre covariant dans le type de valeur, donc Map[String, String] est déjà Map[String, Object], pas map ou mapValues nécessaire. Vous pouvez l'affecter à un val avec le type désiré ou utiliser le type d'inscription: arguments: Map[String, Object]. Ensuite, appelez asJava:

(arguments: Map[String, Object]).asJava 

Notez que l'utilisation asInstanceOf lorsqu'ils ne sont pas nécessaires, comme les autres réponses font, est mauvais style: si vous modifiez les types plus tard, le compilateur ne peut pas vous dire où votre code doit être modifié .