1

我有两个 Java 类:LogEntryRecord.

该类LogEntry具有如下所示的方法:

public LogEntry setRec(List<Map<String,List<Record>>> rec) 

在 Scala 中,我尝试这样Record输入:LogEntry

import scala.collection.JavaConversions._
import collection.mutable._
val log = new LogEntry()
val rec = new Record()

val map:java.util.Map[String, java.util.List[Record]] = HashMap("sessionKey" -> ArrayBuffer(rec))
log.setRec(List(map))

但我得到一个编译错误:

scala> val map:java.util.Map[String, java.util.List[Record]] = HashMap("sessionKey" -> ArrayBuffer(eventPart))
<console>:14: error: type mismatch;
 found   : scala.collection.mutable.HashMap[String,scala.collection.mutable.ArrayBuffer[Record]]
 required: java.util.Map[String,java.util.List[Record]]
       val map:java.util.Map[String, java.util.List[Record]] = HashMap("sessionKey" -> ArrayBuffer(eventPart))
                                                                      ^

似乎从 Scala 集合到 Java 集合的自动约定失败了,但如官方文档中所述

mutable.Buffer   <=>     java.util.List   
mutable.Map     <=>     java.util.Map

scala> val jul: java.util.List[Int] = ArrayBuffer(1, 2, 3)   
jul: java.util.List[Int] = [1, 2, 3]   

scala> val m: java.util.Map[String, Int] = HashMap("abc" -> 1, "hello" -> 2)   
m: java.util.Map[String,Int] = {hello=2, abc=1}

ArrayBuffer可以转换为java.util.ListHashMap也可以转换为java.util.Map.

那么,为什么会出现这个错误呢?

4

3 回答 3

2

这是由于 scala 隐式转换中的一些怪癖而发生的。以下应该工作。

val map: java.util.Map[String, java.util.List[EventPart]] = 
  HashMap("sessionKey" -> (ArrayBuffer(eventPart):java.util.List[EventPart]))

作为一个测试我做了

scala>  val map:java.util.Map[String, java.util.List[String]] = 
   HashMap("sessionKey" -> (ArrayBuffer("aa"):java.util.List[String]))
map: java.util.Map[String,java.util.List[String]] = {sessionKey=[aa]}
于 2012-11-20T10:05:16.820 回答
2

隐式转换不适用于类型参数(尽管您可以使用视图边界来模拟它)。也就是说,如果您有从Footo的隐式转换,则可以在需要Bar的地方使用 type 的值:FooBar

val foo: Foo = ...
def bar(b: Bar) = ...
bar(foo)

但是(例如)Seq[Foo]不能用来代替Seq[Bar]

val foo: Foo = ...
def bar(list: Seq[Bar]) = ...
bar(Seq(foo)) // type error

这就是为什么不能在那里使用ArrayBuffer和之间的转换。java.util.List

于 2012-11-20T12:10:20.307 回答
0

我不知道您使用的是哪个版本的 scala,但是在最新的官方文档中,您必须首先导入 collection.JavaConverters._ 然后调用 asJava 或 asScala 在原始 java 和 scala 之间转换集合对象。见官方示例如下:

scala> import collection.mutable._
import collection.mutable._

scala> val jul: java.util.List[Int] = ArrayBuffer(1, 2, 3).asJava

jul: java.util.List[Int] = [1, 2, 3]

scala> val buf: Seq[Int] = jul.asScala

buf: scala.collection.mutable.Seq[Int] = ArrayBuffer(1, 2, 3)

scala> val m: java.util.Map[String, Int] = HashMap("abc" -> 1, "hello" -> 2).asJava

m: java.util.Map[String,Int] = {abc=1, hello=2}
于 2018-12-24T03:37:33.383 回答