2017-10-10 4 views
0

Je commence avec Scala et je remplace la bibliothèque obsolète JavaConversions par JavaConverters. J'ai le code suivant:Collections Scala: util.Map [Chaîne, AnyRef] - Carte [Chaîne, Chaîne]

import scala.collection.JavaConversions._ 

new AMQP.BasicProperties.Builder() 
    .contentType(message.contentType.map(_.toString).orNull) 
    .contentEncoding(message.contentEncoding.orNull) 
    .headers(message.headers) //<<<<--------------- I SEE THE ERROR ON THIS LINE (datatype of message.heads is Map[String, String] 
    .deliveryMode(toDeliveryMode(message.mode)) 
    .priority(..) 
    .correlationId(..) 
    .replyTo(..) 
    .expiration(..) 
    .messageId(..) 
    .timestamp(..) 
    .`type`(..) 
    .userId(..) 
    .appId(..) 
    .build() 

}

Quand je remplace l'importation pour JavaConversions-JavaConverters (ou, tout simplement commenter l'importation tout à fait), je reçois l'exception de compilation:

Type mismatch expected: util.Map[String, AnyRef], actual Map[String, String] 

Qu'est-ce qui me manque?

+1

vous manque '.asJava' évidemment' util.Map [String, AnyRef] 'est une collection Java' Map [String, String] 'est une collection Scala – dk14

+0

@ dk14 pouvez-vous élaborer s'il vous plaît? Où dois-je ajouter '.asJava'? –

Répondre

1

Il vous manque .asJava évidemment - la conversion explicite est le point entier de l'utilisation de JavaConverters. util.Map[String, AnyRef] est une collection Java, Map[String, String] est une collection Scala. Vous avez besoin d'au moins

.headers(message.headers.asJava.asInstanceOf[java.util.Map[String, AnyRef]]) 

ou mieux faire le type moulé sous pression en toute sécurité avant d'appeler asJava:

val params: Map[String, AnyRef] = message.headers 
... 
.headers(params.asJava) 

post-scriptum La raison pour laquelle vous avez une deuxième erreur après avoir fait asJava n'est pas liée à Scala ou JavaConvertors, c'est juste que V dans java.util.Map[K,V] n'est pas covariant (c'est invariant, contrairement à Map[K, +V] de Scala). En fait, les messages compilateur explique:

Remarque: String <: AnyRef, mais trait Java défini La carte est de type V. invariant dans

+0

maintenant je vois: Type incompatibilité attendue: util.Map [String, AnyRef], réelle util.Map [String, String] –

+0

@ Darth.Vader ce n'est pas lié à Scala ou convertisseurs - la carte de Java n'est pas contra-variant sur le second argument, vous devez donc le faire en style java (typecast). Fondamentalement, le message du compilateur le suggère: "Note: String <: AnyRef, mais le trait défini par Java Map est invariant dans le type V." – dk14

-1

Essayez ceci:

val headers: Map[String, AnyRef] = message.headers 

.headers(headers.asJava)