Ошибка приведения типов Java Scala-STM при чтении из TArray

У меня есть (неоцененное) задание по программированию, в котором я должен реализовать циклическую очередь с использованием scala-stm из https://nbronson.github.io/scala-stm/.

У меня есть функция получения:

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. Я делаю что-то не так, но я не уверен, что. Спасибо за любые подсказки!


person Olli    schedule 25.05.2020    source источник
comment
1. Является ли выбор scala-stm частью задания? Библиотека выглядит заброшенной, так что если бы я мог выбрать, я бы выбрал что-нибудь другое. 2. Почему вы используете библиотеки Scala из Java? Это больно работать с кодом таким образом.   -  person Mateusz Kubuszok    schedule 25.05.2020
comment
@MateuszKubuszok О, я этого не знал, на одном слайде говорится, что это относительно новый способ, и это может быть более простой способ, чем использовать блокировки. Я думаю, что это может быть просто способ научить нас СТМ и ТМ, а не заставлять нас учить совершенно новый язык. Нашему профессору, похоже, это нравится. Редактировать; и да, scala-stm является частью задания.   -  person Olli    schedule 25.05.2020
comment
@MateuszKubuszok Я также обнаружил свою ошибку: я возвращаю объект refview, а не фактический объект. Смотрите мой собственный ответ ниже, если вам интересно.   -  person Olli    schedule 25.05.2020


Ответы (1)


Я нашел свою ошибку. Этот:

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

Должно быть: E item = items.apply(tail.get());

.refViews().apply() возвращает объект представления, который доступен только для чтения переменной, на которую ссылается память, если я правильно понял. .apply() напрямую возвращает фактический объект, на который представление ссылается в памяти.

person Olli    schedule 25.05.2020