2016-03-14 21 views
8

Potrzebuję zastosować metodę, która zwraca "Seq", w Javie Ale napotykam błąd, nie wiem jak go rozwiązać.Konwertuj listę Java na Scala Seq

java.util.ArrayList cannot be cast to scala.collection.Seq 

Oto mój kod tak daleko

@Override 
public Seq<String> columnNames() { 
    List<String> a = new ArrayList<String>(); 
    a.add("john"); 
    a.add("mary"); 
    Seq<String> b = (scala.collection.Seq<String>) a; 
    return b; 
} 

scala.collection.JavaConverters. nie wydaje się oferować możliwość konwertowania jako Seq. Dziękujemy

+7

Możliwe duplikat [Konwersja zbiór Java w kolekcji Scala] (http://stackoverflow.com/questions/674713/converting-a-java-collection-into -a-scala-collection) –

+1

Pytasz o kłopoty, jeśli spróbujesz coś zrobić z kolekcjami Scala w Javie. Napisz trochę kodu Scala, który wykonuje konwersję przy użyciu scala.collection.JavaConverters. –

+0

@ TzachZohar większość odpowiedzi jest wykonywana jest scala. Mój kod to Java, to część ogromnego programu, nie mogę przekazać tego leczenia na zewnątrz ... – Fundhor

Odpowiedz

13

JavaConverters jest tym, czego potrzebowałem, aby rozwiązać ten problem.

import scala.collection.JavaConverters; 

public Seq<String> convertListToSeqTest() { 
    List<String> a = new ArrayList<String>(); 
    a.add("john"); 
    a.add("mary"); 
    return JavaConverters.asScalaIteratorConverter(a.iterator()).asScala().toSeq(); 
} 
15

JavaConversions powinien działać. Myślę, że szukasz czegoś takiego: JavaConversions.asScalaBuffer(a).toSeq()

+3

'JavaConversions' jest przestarzałe, a teraz powinno być napisane jako' JavaConverters.asScalaBuffer (a) ' – kap

+0

_Na czym powinien być? Nah ... Zalecane przez nieznaną osobę, która myślała, że ​​to lepszy pomysł, bardziej to lubię :) – Dima

+0

Prawdopodobnie. Po prostu podążyłem za wskazówkami w API Scala. Nie znam żadnej z osób, które ją pisały i/lub ją deprecjonowały ;-) – kap

4

@Fundhor, metoda asScalaIterableConverter nie pojawiła się w IDE. Może to być spowodowane różnicami w wersjach Scala. Używam Scala 2.11. Zamiast tego pojawił się asScalaIteratorConverter. Wprowadziłem niewielką zmianę do Twojego ostatecznego fragmentu i wszystko działało dobrze dla mnie.

scala.collection.JavaConverters.asScalaIteratorConverter(columnNames.iterator()).asScala().toSeq() gdzie columnNames to java.util.List.

dziękuję!

2

do 4 elementów, można po prostu użyć metody fabryki klasy Seq tak:

Seq<String> seq1 = new Set.Set1<>("s1").toSeq(); 
Seq<String> seq2 = new Set.Set2<>("s1", "s2").toSeq(); 
Seq<String> seq3 = new Set.Set3<>("s1", "s2", "s3").toSeq(); 
Seq<String> seq4 = new Set.Set4<>("s1", "s2", "s3", "s4").toSeq(); 
2

Ten pracował dla mnie! (Java 8, iskra 2.0.0)

import java.util.ArrayList; 

import scala.collection.JavaConverters; 
import scala.collection.Seq; 

public class Java2Scala 
{ 

    public Seq<String> getSeqString(ArrayList<String> list) 
     { 
      return JavaConverters.asScalaIterableConverter(list).asScala().toSeq(); 
     } 

} 
Powiązane problemy