2016-01-09 41 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 
    } 
} 
相关问题