【发布时间】: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 文件 Bts、Ts 和 Tse:
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 对象列表,即
tse1、tse2、tse3和tse4放入Bts中,这就是故事的全部目的。稍后我将调用一些 scala 方法,其参数将是包含列表的 bts 对象。因为我没有找到任何正确的 scala 方法可以将所有tse1、tse2、tse3和tse4对象放入列表然后放入bts。所以我投了它,得到了ClassCastException。 -
是否可以将列表放入java中的
Bts?我可以从 scala 做同样的事情,但在这里遇到问题。看我的更新。mcallmethod 将Iterator[Tse]作为参数,所以我需要从 java 类中传递它,我认为它是迭代器中tse对象的列表。我还尝试创建一个abstract class并在 java 中使用但没有运气。
标签: java scala traits scala-java-interop