2012-09-10 10 views
7

Napisałem API w Scali. Istnieje kilka punktów wejścia, w których oczekuję listy [SomeTrait] jako danych wejściowych i zwracających listę [OtherTrait].Wywołanie kodu Scala z Java z java.util.List, gdy oczekuje się listy Scali

Włączam ten Jar do projektu Java i próbuję przekazać java.util.List do metody oczekującej obiektu Scala's List. Rozumiem, że nie są one takie same i że Java nie wie, jak przeprowadzić konwersję. Jak to zrobić, nie oczekując, że program wywołujący Java przejdzie na listę Scala?

Odpowiedz

7

Chciałbym usłyszeć inne sugestie, ale to jest rozwiązanie, które znalazłem i nie mogłem go znaleźć nigdzie w Google.

Jeśli mój normalny Scala entry-point jest to metoda, która jest mniej więcej tak:

def doSomething(things: List[Thing]): List[Result] = { ... } 

dodać inną metodę tak:

//import scala.collection.JavaConversions._ 
import scala.collection.JavaConverters._ 

def doSomething(things: java.util.List[Thing]): java.util.List[Result] = 
    doSomething(things.asScala.toList).asJava 

Wyraźna konwersji w zaproszeniu do oryginału Metoda polega na tym, że kończy się nieskończoną pętlą wywołującą samą siebie.

To jest moja pierwsza próba opublikowania i odpowiedzi na moje własne pytanie ... przepraszam, jeśli przegapiłem jakiś standardowy sposób robienia tego. Wydawało się, że warto się nim podzielić, a także warto otworzyć się na dyskusję o lepszych metodach, ponieważ jestem BARDZO nowy w Scali.

EDIT Zaktualizowany kod odzwierciedla sugestię od @Luigi Plinge

+0

to dokładnie odpowiedź miałem pisać –

+4

Należy rów 'JavaConversions' i przekonwertować wynik z powrotem do listy Java przy użyciu' .asJava' –

+1

+1 do sugestii Luigiego, nie używaj JavaConversions, używaj JavaConverters i jawnych metod .asJava/.asScala - niejawne konwersje mogą robić dziwne rzeczy. Unikaj także przeciążania, utwórz shim/wrapper do wywołania z Javy. –

Powiązane problemy