Формирование объекта типа из списка объектов класса

Я намерен поместить список объектов Tse в объект Bts в Java:

    Bts Object should contain List=
    List(Tse(1285927200000,1285928100000,0.0), 
    Tse(1285928100000,1285929000000,1.0), 
    Tse(1285929000000,1285929900000,2.0), 
    Tse(1285929900000,1285930800000,3.0))

У меня есть файлы scala Bts, Ts и Tse:

Bts.scala

trait Bts extends Ts{
  def start:Long
  def end:Long
  def timezone:TimeZone
}

Ц.скала

Object Ts { //Some methods }
trait Ts extends Iterator[Tse] {
  //Some methods
}

Це.скала

case class Tse(val start:Long, val end:Long, val value:Option[Double], val elapsed:Long) {
 def this(start: java.lang.Long, end: java.lang.Long, 
 value: java.lang.Double) = {
    this(start, end, Option(value), end-start)
  }
  //Some methods
}

Итак, в коде Java я хочу сделать объект Bts таким, чтобы он содержал следующее:

List(Tse(1285927200000,1285928100000,0.0), 
Tse(1285928100000,1285929000000,1.0), 
Tse(1285929000000,1285929900000,2.0), 
Tse(1285929900000,1285930800000,3.0))

Мой код Java для этого:

Tse tse1= new Tse(1285927200000L, 1285928100000L, 0.0);

Tse tse2 = new Tse(1285928100000L, 1285929000000L, 1.0);

Tse tse3= new Tse(1285929000000L, 1285929900000L, 2.0);

Tse tse4 = new Tse(1285929900000L, 1285930800000L, 3.0);

List<Tse> entryList = new ArrayList<Tse>();
entryList.add(tse1);
entryList.add(tse2);
entryList.add(tse3);
entryList.add(tse4);

Bts bts= (Bts) entryList; //exception

Tsr$ tsr= Tsr$.MODULE$;
tsr.mcall(bts);

Как вы видите, последняя строка дает мне исключение:

Caused by: java.lang.ClassCastException: java.util.ArrayList 
cannot be cast to com.testapp.people.user.Bts

ОБНОВЛЕНИЕ:

Цр.скала

object Tsr {
def mcall(sourceData: Iterator[Tse]) : Bts = { //Other calls}
}

ОБНОВЛЕНИЕ:

Я попытался создать абстрактный класс в Bts, а затем попытался получить к нему доступ из Java:

В Bts.scala добавлено следующее:

abstract class Bs(buffer:Iterator[Tse]) extends Bts{
}

Из джавы:

Iterator<Tse> iterator = entryList.iterator();
Bts bts= new Bs(scala.collection.JavaConversions$.MODULE$.
asScalaIterator(iterator)); //exception

Теперь я получаю ошибку времени компиляции как:

Cannot instantiate the type Bs

person My God    schedule 07.01.2016    source источник
comment
Не могли бы вы добавить класс Bts?   -  person Spooky    schedule 07.01.2016
comment
Bts — это черта, которую я уже добавил.   -  person My God    schedule 07.01.2016
comment
Ну Bts не ArrayList[Tse]. Если вы разыграете это таким образом, неудивительно, что вы получите ClassCastException. Не могли бы вы уточнить, чего вы хотите добиться последней строкой? Вы хотите создать экземпляр Bts из Java? Обратите внимание, что трейты не всегда могут быть реализованы в Java в соответствии с этим вопросом. Вероятно, лучше всего было бы предоставить abstract class для использования с Java.   -  person 0__    schedule 07.01.2016
comment
Я хочу поместить список объектов Tse, т.е. tse1, tse2, tse3 и tse4, в Bts, что является всей целью истории. Позже я вызову какой-нибудь scala-метод, параметром которого будет этот объект bts, содержащий список. Поскольку я не нашел правильного способа scala, который мог бы поместить все объекты tse1, tse2, tse3 и tse4 в список, а затем в bts. Так что я разыграл его и получил ClassCastException.   -  person My God    schedule 07.01.2016
comment
Можно ли вообще поместить список в Bts из java? Я могу сделать то же самое из scala, но здесь возникают проблемы. Смотрите мое обновление. Метод mcall принимает Iterator[Tse] в качестве аргумента, поэтому мне нужно передать его из класса java, который, как мне кажется, представляет собой список объектов tse в итераторе. Также я безуспешно пытался создать abstract class и использовать в java.   -  person My God    schedule 07.01.2016
comment
Спасибо, теперь он работает, используя класс (не абстрактный), который действует как оболочка для Bts :)   -  person My God    schedule 07.01.2016
comment
Если сейчас это работает, вы должны добавить ответ и принять свой собственный ответ.   -  person Kyrstellaine    schedule 08.01.2016


Ответы (1)


Пример, который вы опубликовали, представляет собой полный беспорядок странных имен классов, которые не соответствуют друг другу.

Думаю, я понимаю, что вы пытаетесь сделать, и это действительно легко сделать, если вы сделаете немного меньше беспорядка.

Также вы никогда не должны ссылаться на что-либо, содержащее $, из вашего исходного кода, если вы действительно не знаете, что делаете. Он там для использования компилятором.

Скала:

trait Data {
  val foo: Int
  val Bar: Int
}

case class DataCase(foo: Int, Bar: Int) extends Data

object Test {
  def doSomething(it: Iterator[Data]) = {
    for (x <- it) println(x)
  }
}

Ява:

import scala.collection.JavaConversions;
import java.util.ArrayList;
import java.util.List;

public class TestJava {
    public static void main(String[] args) {
        List<Data> list = new ArrayList<>();

        list.add(new DataCase(1, 2));
        list.add(new DataCase(3, 4));
        list.add(new DataCase(4, 5));

        Test.doSomething(JavaConversions.asScalaIterator(list.iterator()));
    }
}
person bdew    schedule 01.02.2016