不会发生java.util.List到scala List的隐式转换

mat*_*att 11 java scala implicit-conversion scala-java-interop

我对scala.collection.JavaConversions有一个非常基本的问题.我希望以下代码可以工作,但是从java.util.List [String]到scala List [String]的隐式转换不会发生.为什么?

import collection.JavaConversions._
import java.util
class Test {
  def getStrings() : List[String] = {
    val results : java.util.List[String] = new java.util.ArrayList[String]()
    results
  }
}
Run Code Online (Sandbox Code Playgroud)

我从compi得到以下消息

type mismatch;
 found   : java.util.List[String]
 required: scala.collection.immutable.List[String]
    results
    ^
Run Code Online (Sandbox Code Playgroud)

Jat*_*tin 23

将其转换为:

def getStrings() : Seq[String] = {
    val results : java.util.List[String] = new java.util.ArrayList[String]()
    results
  }  
Run Code Online (Sandbox Code Playgroud)

这是因为,转换的隐式函数定义为:

implicit def asScalaBuffer[A](l: java.util.List[A]): mutable.Buffer[A] 
Run Code Online (Sandbox Code Playgroud)

它返回a mutable.Buffer而不是scala.collection.immutable.List.因此错误.所以替代方法是使用a Seq代替List或将其转换immutable.List为如下所示:

def getStrings() : List[String] = {
    val results = new java.util.ArrayList[String]()     
    results.toList
}
Run Code Online (Sandbox Code Playgroud)


pan*_*nnu 13

您需要做的就是导入:

import scala.collection.JavaConversions._
Run Code Online (Sandbox Code Playgroud)