【问题标题】:Forming object of trait from the list of objects of class从类对象列表中形成特征对象
【发布时间】:2016-01-07 10:12:43
【问题描述】:

我的意图是将Tse 对象列表放入Java 中的Bts 对象中:

    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 文件 BtsTsTse

Bts.scala

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

Ts.scala

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

Tse.scala

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

更新:

Tsr.scala

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

更新:

我尝试在Bts 中创建一个抽象类,然后尝试从Java 访问它:

Bts.scala中添加了以下内容:

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

来自java:

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

现在我收到编译时错误:

Cannot instantiate the type Bs

【问题讨论】:

  • 可以添加 Bts 类吗?
  • Bts 是我已经添加的特征。
  • 好吧,Bts 不是ArrayList[Tse]。如果你以这种方式投射,你会得到ClassCastException 也就不足为奇了。可以更清楚地指定最后一行要实现的目标吗?您想从 Java 创建Bts 的实例吗?请注意,根据this question,特性并不总是在 Java 中实现。最好的办法可能是提供一个abstract class 以便在 Java 中使用。
  • 我想将 Tse 对象列表,即tse1tse2tse3tse4 放入 Bts 中,这就是故事的全部目的。稍后我将调用一些 scala 方法,其参数将是包含列表的 bts 对象。因为我没有找到任何正确的 scala 方法可以将所有 tse1tse2tse3tse4 对象放入列表然后放入 bts。所以我投了它,得到了ClassCastException
  • 是否可以将列表放入java中的Bts?我可以从 scala 做同样的事情,但在这里遇到问题。看我的更新。 mcall method 将 Iterator[Tse] 作为参数,所以我需要从 java 类中传递它,我认为它是迭代器中 tse 对象的列表。我还尝试创建一个 abstract class 并在 java 中使用但没有运气。

标签: java scala traits scala-java-interop


【解决方案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)
  }
}

Java:

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()));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2022-08-15
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多