2016-01-09 3 views
2

У меня есть метод Scala, используемый в java класс, бросающий ошибку ниже. По какой-то причине неявные преобразования не работают для ListLists, но это работает для List. (Напр: mutable.MutableList к util.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 

Я сделал последнее преобразование (с = b.asJava) Явный и я рекомендовал бы держать его так, чтобы сделать код более готовы для будущих читателей.

+3

не забудьте импортировать 'scala.collection.JavaConverters._' –

+0

Я предполагал, что оригинальный плакат знал об этом, так как он уже имел неявное преобразование, работающее на одном уровне :), но да, я добавлю это к моему ответу, когда я вернитесь на рабочий стол – Jean

+0

, может быть, но люди часто приезжают сюда из Google: p –

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); 
    } 
} 

хорошо компилируется с этим кодом лестницы:

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 
    } 
} 
Смежные вопросы