2016-01-09 42 views
2

我在java中使用了一個Scala方法類拋出下面的錯誤。由於某些原因,隱式轉換對ListLists不起作用,但它對List有效。 (爲前:mutable.MutableListutil.List如何將scala.collection.immutable.List [scala.collection.mutable.MutableList [String]]轉換爲java.util.List [java.util.List [String]]

Error:(124, 143) type mismatch; 
    found: scala.collection.immutable.List[scala.collection.mutable.MutableList[String]] 
    required: java.util.List[java.util.List[String]] 

Error:(124, 143) type mismatch; 
    found: scala.collection.immutable.List[scala.collection.mutable.MutableList[String]] 
    required: scala.collection.immutable.List[java.util.List[String]] 
+3

我想我是能夠理解你的問題。在未來,提供一個實際的代碼示例,而不僅僅是編譯器錯誤可以幫助人們回答你:) – Jean

+0

好吧,會做的。我的錯!感謝你的回答。 – makeyourrules

回答

5

內部列表將不會被轉換,除非你明確的轉換。

import scala.collection.JavaConverters._ 
import java.util.{List=>JavaList} 
import scala.collection.immutable.{List => ScalaList} 
import scala.collection.mutable.{MutableList => ScalaMutableList} 

val a : ScalaList[ScalaMutableList[String]] = List(MutableList()) 
val b: ScalaList[JavaList[String]]= a.map(_.asJava) 
val c: JavaList[JavaList[String]] = b.asJava 

我做了最後一次轉換(C = b.asJava)明確,我會建議保持這樣使代碼更易於準備未來的讀者。

+3

不要忘記導入'scala.collection.JavaConverters._' –

+0

我認爲原來的海報知道這一點,因爲他已經隱式轉換工作在一個層次:)但是我會添加到我的答案當我回到桌面 – Jean

+0

也許,但人們經常從谷歌來這裏:頁 –

0

Java對scala的存在一無所知。所以整個scala < - > java互操作性應該在scala方面完成。

這java代碼:

import java.util.List; 

public class JavaMethod { 
    public static void main(String[] args){ 
     List<Integer> listInteger = null; 
     List<Integer> resultListInteger = ScalaMethod.argListInteger(listInteger); 

     List<List<Integer>> listListInteger = null; 
     List<List<Integer>> resultListListInteger = ScalaMethod.argListListInteger(listListInteger); 
    } 
} 

與此Scala代碼編譯好:

import scala.collection.JavaConverters._ 

object ScalaMethod { 
    def argListInteger(listInteger: java.util.List[Integer]): java.util.List[Integer] = { 
    val scalaList = listInteger.asScala 

    //Do whatever you want 
    scalaList 
     .filter(e => true) 
     .map(e => e) 
    //And convert back to Java 
     .asJava 
    } 

    def argListListInteger(listListInteger: java.util.List[java.util.List[Integer]]) = { 
    val scalaListListInteger = listListInteger.asScala.map(_.asScala) 

    //Do whatever you want 
    scalaListListInteger 
     .filter(e => true) 
     .map(e => e) 
    //And convert back to Java 
     .map(_.asJava) 
     .asJava 
    } 
} 
相關問題