【发布时间】:2020-09-11 21:33:27
【问题描述】:
我有一个(未分级的)编程任务,我必须使用来自https://nbronson.github.io/scala-stm/ 的 scala-stm 实现一个循环队列。
我有一个get函数:
public E get() {
E item = STM.atomic(new Callable<E>(){ public E call()
{
if (isEmpty()) STM.retry();
E item = (E) items.refViews().apply(tail.get());
//STM.increment(count, -1);
return item;
}});
return item;
现在我必须转换为 E, (E) items.refViews().apply(tail.get());或者我得到一个编译器错误。哪种是有道理的。 但在单元测试中,该项目尝试被强制转换为 int,以验证它与放入循环队列时的值是否相同。
但我得到以下 classCastException:
java.lang.ClassCastException: class scala.concurrent.stm.ccstm.TArrayImpl$$anon$3 cannot be cast to class java.lang.Integer (scala.concurrent.stm.ccstm.TArrayImpl$$anon$3 is in unnamed module of loader 'app'; java.lang.Integer is in module java.base of loader 'bootstrap')
虽然对象最初是一个整数,但它不能被回滚。 我应该怎么做? 我已经详细研究了文档,它似乎实际上以相同的方式进行,但对于字符串。 当我尝试使用字符串时,我不再遇到此异常,但转换回变成了 TArray 对象的名称。 我做错了什么,但我不确定是什么。 感谢您的任何提示!
【问题讨论】:
-
1. scala-stm 选择是作业的一部分吗?图书馆看起来已经被废弃了,所以如果我可以选择,我会选择其他东西。 2. 你为什么使用 Java 中的 Scala 库?以这种方式处理代码很痛苦。
-
@MateuszKubuszok 哦,我不知道,一张幻灯片说它相对较新,可能比使用锁更简单。我认为这可能只是一种教我们 stm 和 tm 的方式,而不是让我们学习一门全新的语言。不过我们的教授似乎很喜欢它。编辑;是的,scala-stm 是作业的一部分。
-
@MateuszKubuszok 我也发现了我的错误,我返回的是一个 refview 对象而不是实际对象。如果您有兴趣,请在下面查看我自己的答案。
标签: java scala concurrency stm