7

asynchttpclientを使用しています。パラメータを作成するときは、java.util.MapをsetParametersメソッドに渡します。

(Java)署名は次のようになります。

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

実日1のもの。しかし、すごい、私はそれをScalaから呼び出そうとしているので、その署名に一致するコレクションを作成することはできません。

これが私がこれまでに作成した混乱です。

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

そして、これがエラーメッセージです。

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 : 

十分に公平なことですが、私が特に複雑なことをしているとは思わなかったでしょうが、コンパイラの提案を試してみましょう...

なので、次のように変更します

 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

そして、それに応じて次の素敵なエラーメッセージを受け取ります。

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])

基本に戻りますが、最初の試みは次のとおりでした。

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

しかし、それは次のことを生み出しました

この行の複数のマーカー-オーバーロードされたメソッド値setParametersと代替:(com.ning.http.client.FluentStringsMap)com.ning.http.client.RequestBuilder(java.util.Map [java.lang.String、java.util。 Collection [java.lang.String]])com.ning.http.client.RequestBuilderを(java.util.Map [String、Set [String]])に適用できません

編集、__0のおかげで、これは現在機能しています。これが私の最終的なコードです:

 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
4

1 に答える 1

9

さて、最初のエラーメッセージはそれを明らかにしましたjava.util.Map—は可変であるため、分散を処理できません。Map[_,Set[_]]したがって、をにキャストすることはできません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)
于 2012-07-25T15:22:58.600 に答える