gpt4 book ai didi

java - Scala,不喜欢 java 集合 API?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:18:28 25 4
gpt4 key购买 nike

我正在使用 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

但这产生了以下结果

Multiple markers at this line - overloaded method value setParameters with alternatives: (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 cannot be applied to (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

最佳答案

好吧,第一条错误消息很清楚 — 因为 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)

关于java - Scala,不喜欢 java 集合 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11652978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com