1

と の 2 つの Java クラスがLogEntryありRecordます。

このLogEntryクラスには、以下に示すメソッドがあります。

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

Scalaでは、次のように入れようとしてRecordLogEntryます:

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.ListできHashMapます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

暗黙的な変換は型パラメーターには適用されません (ただし、ビューの境界を使用してシミュレートできます)。つまり、 からFooへの暗黙的な変換がある場合、が必要な場所Barで type の値をFoo使用できます。Bar

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 に答える