Frage

Ich verwende asynchttpclient.Beim Aufbau von Parametern übergibt man eine java.util.Map an die setParameters-Methode.

Die (Java-)Signatur sieht wie folgt aus:

setParameters(Map<String,Collection<String>);

Echtes Zeug vom ersten Tag.Aber wow, ich versuche, es von Scala zu nennen, und ich kann beim besten Willen keine Kollektion erstellen, die dieser Signatur entspricht.

Hier ist das Durcheinander, das ich bisher angerichtet habe.

var m:java.util.Map[java.lang.String,java.util.Collection[java.lang.String]] = new java.util.HashMap[java.lang.String,java.util.HashSet[java.lang.String]]()
val req = new RequestBuilder().setUrl("http://localhost:1234/").setParameters(m).build

Und hier ist die Fehlermeldung:

Multiple markers at this line
- type mismatch; found : java.util.HashMap[java.lang.String,java.util.HashSet[java.lang.String]] required: 
 java.util.Map[java.lang.String,java.util.Collection[java.lang.String]] Note: java.util.HashSet[java.lang.String] <: java.util.Collection[java.lang.String], but Java-defined 
 **trait Map is invariant in type V. You may wish to investigate a wildcard type such as `_ <: java.util.Collection[java.lang.String]`. (SLS 3.2.10)**
- type mismatch; found : 

Okay, ich hätte nicht gedacht, dass ich etwas besonders Kompliziertes mache, aber probieren wir mal den Compiler-Vorschlag aus ...

Also ändere ich es wie folgt

 var m:java.util.Map[java.lang.String,_ <: java.util.Collection[java.lang.String]] = new java.util.HashMap[java.lang.String,java.util.HashSet[java.lang.String]]()
 val req = new RequestBuilder().setUrl("http://localhost:1234/").setParameters(m).build

Als Antwort erhalten Sie die folgende schöne Fehlermeldung.

Multiple markers at this line
    - overloaded method value setParameters with alternatives: (com.ning.http.client.FluentStringsMap)com.ning.http.client.RequestBuilder <and> 
     (java.util.Map[java.lang.String,java.util.Collection[java.lang.String]])com.ning.http.client.RequestBuilder cannot be applied to (java.util.Map[java.lang.String,_$1])

Zurück zu den Grundlagen: Ich möchte auch erwähnen, dass mein erster Versuch wie folgt aussah.

   import scala.collection.JavaConverters._
   var m = Map[String,Set[String]]()
   val req = new RequestBuilder().setUrl("http://localhost:1234/").setParameters(m.asJava).build

Aber das hat folgendes ergeben

Mehrere Markierungen in dieser Zeile - überlastete Methodenwert -Wert -SetParameter mit Alternativen:(com.ning.http.client.fluentStringsmap) com.ning.http.client.requestbuilder (java.util.map [java.lang.string, java.util.collection [java.lang.string]))))))))) .http.client.RequestBuilder kann nicht auf (java.util.map [string, set [string]] angewendet werden)

Bearbeiten, dank __0 funktioniert das jetzt.Hier ist mein endgültiger Code:

 def buildReqMap(in: Map[String, String]) = {
   import java.util.{ Map => JMap, Collection => JColl, HashMap => JHashM, HashSet => JHashS }
   val m: JMap[String, JColl[String]] =
     new JHashM[String, JColl[String]]()
   in.fold(m) { (a, b) =>
     {
       val s = new JHashS[String]()
       s.add(b.asInstanceOf[String])
       m.put(a.asInstanceOf[String], s)
       m
     }
   }
   m
 }

 def main(args: Array[String]): Unit = {
   val m = buildReqMap(
     Map(
       ("delimited" -> "length"),
       ("track" -> "binarytemple,music,kittens")))

   val req = new RequestBuilder().setUrl("http://localhost:1234/").setParameters(m).build
   val fut = asyncHttpClient.executeRequest(req, handler).get
War es hilfreich?

Lösung

Nun, die erste Fehlermeldung machte es deutlich – seitdem java.util.Map ist veränderlich, es kann mit Varianz nicht umgehen.Sie können also kein a wirken Map[_,Set[_]] zu einem Map[_,Collection[_]].

val m: java.util.Map[String, java.util.Collection[String]] = 
   new java.util.HashMap[String,java.util.Collection[String]]()
val s = new java.util.HashSet[String]()
s.add("welt")
m.put("hallo", s)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top