2017-06-13 4 views
1

J'utilise une API Java qui nécessite ArrayList comme paramètre. Maintenant, dans Scala, j'ai une liste [String]. Comment puis-je convertir la liste [String] en ArrayList dans Scala?Comment faire pour convertir Scala List en Java ArrayList

J'ai essayé:

import scala.collection.JavaConverters._ 
val scalaList = List("a","b","c") 
scalaList.asJava 

Le résultat est:

java.util.List[String] = [a, b, c] 

La précède ne fonctionne pas parce que je veux que le résultat soit

java.util.ArrayList [Chaîne ]

au lieu de

java.util.List [chaîne] = [a, b, c]

+0

'' ArrayList est mise en œuvre de '' Liste en Java. Il est logique de retourner 'Liste '. – prayagupd

+1

La liste est le type d'interface qui représente n'importe quelle liste, et en tant que tel, c'est ce que la plupart des gens prennent comme paramètre au lieu d'une instance spécifique. Prenant l'instance spécifique sans commentaire spécifique, et en particulier un comme ArrayList, devrait toujours au moins être documenté avec une bonne raison. – midor

Répondre

3

Il est tout à fait logique de retour java.util.List[T] qui est une interface Java et peut avoir ArrayList[T] ou comme LinkedList[T] la mise en oeuvre.

scala> val scalaList = List(1,2,3) 
scalaList: List[Int] = List(1, 2, 3) 

scala> import scala.collection.JavaConverters._ 
import scala.collection.JavaConverters._ 

scala> scalaList.asJava 
res22: java.util.List[Int] = [1, 2, 3] 

À mon avis, il doit être converti en ArrayList[T] ou LinkedList[T] tout ce que vous voulez par vous-même.

Une façon que je pouvais penser est

scala> new java.util.ArrayList[Int](scalaList.asJava) 
res27: java.util.ArrayList[Int] = [1, 2, 3] 

ou

scala> new java.util.LinkedList[Int](scalaList.asJava) 
res28: java.util.LinkedList[Int] = [1, 2, 3] 

meilleure version de ce serait

scala> def toArrayList[T](input: List[T]): java.util.ArrayList[T] = new java.util.ArrayList[T](input.asJava) 
toArrayList: [T](input: List[T])java.util.ArrayList[T] 

scala> toArrayList(List(1000, 2000, 3000)) 
res33: java.util.ArrayList[Int] = [1000, 2000, 3000] 

Et la meilleure version serait, écrire implic elle méthode

class AsArrayList[T](input: List[T]) { 
    def asArrayList : java.util.ArrayList[T] = new java.util.ArrayList[T](input.asJava) 
} 

implicit def asArrayList[T](input: List[T]) = new AsArrayList[T](input) 

List(1000, 2000, 3000).asArrayList 
+0

J'ai essayé, val input = Liste ("a", "b", "c"); myapi (new java.util.ArrayList [String] (input.asJava)); Mais got "value asjava n'est pas un membre de List [String]". – derek

+0

avez-vous importé 'import scala.collection.JavaConverters._', c'est-à-dire où la méthode' asJava' est – prayagupd