使用Scala的集合类型从Java调用Scala的方法

时间:2015-08-19 23:28:15

标签: java scala

我有一个调用Scala方法的Java代码。

Java端代码:

List<String> contexts = Arrays.asList(initialContext);
ContextMessage c = ContextMessage.load(contexts);

Scala边码:

def load(contexts: List[String]) = ...
    contexts foreach context => 

enter image description here

在这种情况下,我有scala.collection.immutable.List<String> cannot be applied ...错误消息。

我还需要使上下文的类型尽可能通用(即Seq),因为load方法迭代给定的集合对象以处理某些事物。

def load(contexts: Seq[String]) = ...

如何解决这两个问题?

2 个答案:

答案 0 :(得分:1)

我只会使用JavaConversions并保留我的Scala代码 scalatic

 // Scala code
object ContextMessage {
    def load(contexts: Seq[String]) = ???
}

// in your Java code
ContextMessage c = ContextMessage.load(JavaConversions.asScalaBuffer(Arrays.asList(initialContext));

答案 1 :(得分:0)

在Scala调用此方法的情况下,java.util.ArrayList和Seq类型之间的隐式转换可以轻松解决此问题。

import scala.collection.mutable.ListBuffer

object ContextMessage  extends App  {

    implicit def typeConversion(input: java.util.ArrayList[String]) = {
        val res : ListBuffer[String] = new ListBuffer[String]()
        for (i <- 0 to input.size - 1) {
            // println(input.get(i))
            res += input.get(i)
        }
        res
    }

    def load(contexts: Seq[String]) = {
        contexts foreach { c =>
            println(c)
        }
    }

    val x = new java.util.ArrayList[String]()
    x.add("A")
    x.add("B")
    load(x)
}

ContextMessage.main(args)

结果显示:

A
B