2013-08-05 21 views
10

Mam bardzo podstawowy problem z scala.collection.JavaConversions. Spodziewam się, że poniższy kod zadziała, ale niejawna konwersja z java.util.List [String] na scala List [String] nie nastąpi. Czemu?Implicit konwersji java.util.List na scala List nie występuje

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

dostaję następujący komunikat Compi

type mismatch; 
found : java.util.List[String] 
required: scala.collection.immutable.List[String] 
    results 
    ^

Odpowiedz

20

przekonwertować go do:

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

To dlatego, że niejawna funkcja konwersji jest definiowany jako:

implicit def asScalaBuffer[A](l: java.util.List[A]): mutable.Buffer[A] 

Zwraca ona mutable.Buffer, a nie scala.collection.immutable.List. Stąd błąd. Więc alternatywą jest użycie Seq zamiast List lub przekształcić go w immutable.List jak poniżej:

def getStrings() : List[String] = { 
    val results = new java.util.ArrayList[String]()  
    results.toList 
} 
+0

Nie musisz ': java .util.List [String] 'w pierwszym przypadku. –

+0

@AlexeyRomanov jest pokazany tylko dla wyjaśnienia, gdzie jest konwertowany. – Jatin

6

Wszystko, co musisz zrobić, to aby importować to:

import scala.collection.JavaConversions._