【问题标题】:Java Scala-STM typecasting error when reading from TArray从 TArray 读取时出现 Java Scala-STM 类型转换错误
【发布时间】: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


【解决方案1】:

我发现了我的错误。 这个:

E item = (E) items.refViews().apply(tail.get());

应该是: E item = items.apply(tail.get());

如果我理解正确,.refViews().apply() 返回一个视图对象,该对象是只读的内存中引用的变量。 .apply() 直接返回视图在 mem 中引用的实际对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2020-04-11
    相关资源
    最近更新 更多