2015-04-14 1 views
0

То, что я пытаюсь выполнить, просто: Верните список, содержащий Tuple2 в качестве итератора Java.Проблемы с Scala Iterator против Java Iterator (кастинг-кошмар): как отбросить Java на Scala?

Фрагмент кода:

....public java.util.Iterator<Tuple2<Path, Text>> call(InputSplit inputSplit, java.util.Iterator<Tuple2<LongWritable, Text>> iter) throws Exception { 


    ..... java.util.List<Tuple2<Path, Text>> elements = new java.util.ArrayList<Tuple2<Path, Text>>(); 
     while(iter.hasNext()){ 
      Tuple2<LongWritable,Text> tupled = iter.next(); 
      Tuple2<Path, Text> toAdd = new Tuple2<Path, Text>(file.getPath(),tupled._2); 
      elements.add(toAdd); 
     } 
     java.util.Iterator<Tuple2<Path, Text>> it = elements.iterator(); 
     return it; .....} 

Примечание: переменная iter также Java итератора.

Ошибки я получаю: java.lang.ClassCastException: java.util.ArrayList$Itr cannot be cast to scala.collection.Iterator

  1. Что я делаю неправильно? (Я знаю, что я использую Tuple2, который предназначен для Scala).
  2. Как вернуть Java-итератор с Tuple2 или эквивалентом Tuple2?

Спасибо

+0

Что вы подписываете подписи? –

+0

общественного java.util.Iterator > Вызов (InputSplit inputSplit, \t \t \t \t \t java.util.Iterator > ИТЭР) бросает исключение { ... ОБРАТИТЕ ВНИМАНИЕ: Я должен вернуть итератор JAVA –

+0

Вы должны отредактировать свой вопрос, чтобы добавить эту информацию, ее легче читать. Какая строка дает вам эту ошибку? – vptheron

ответ

3

Похоже, что вы делаете нелегальный бросок из Java итератора в Scala итератора.

Попробуйте использовать scala.collection.JavaConversions. При импорте этого неявного класса - эти преобразования будут выполняться автоматически.

Короче -

import scala.collection.JavaConversions._ 

Другой вариант сделать это в явном виде, предполагая javaIterator ваша Java итератора -

import scala.collection.JavaConverters._ 
javaIterator.asScala 
+0

Спасибо, я хотел бы спросить, где именно его использовать, поскольку ошибка появляется в строке ::: java.util.Iterator > it = elements.iterator(); ::: Я попытался отбросить его в конце (по возвращении), и это не сработало. EDIT: ОК У меня есть идея ... сообщит вам. –

+0

Как я уже сказал, вы не должны бросать. Вы должны: «импортировать scala.collection.JavaConversions._', и он будет делать для вас неявно – Maxim

+0

по-прежнему та же проблема, но спасибо за ответ. Сначала я попытаюсь выложить коллекцию, а затем получить итератор Scala, а затем вернуть его на Java, просто для удовольствия. –

1

Maxim ответ правильный, здесь точно Java-код, который будет делать преобразование :

import scala.collection.JavaConversions; 
List<String> javaBatch = new ArrayList<String>(); 
scala.collection.Iterable<String> scalaBatch = JavaConversions.asScalaIterable(javaBatch); 

Аналогичным образом, метод JavaConversions.asScalaIterator() может использоваться для итераторов. Возможно также и наоборот.