Scala 2.8: используйте аннотацию Java с параметром массива

Я пытаюсь реализовать Боб Сессии JavaEE с Scala 2.8.
Поскольку это - Боб Удаленного сеанса, я должен аннотировать его следующей Аннотацией Java:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Remote {
  Class[] value() default {};
} 

Я только нашел этот пример для scala 2.7. В Scala 2.7, его возможное для определения боба сессии как это:

@Remote {val value = Array(classOf[MyEJBRemote])}
class MyEJB
...

Как я могу использовать эту аннотацию тот же путь с Scala 2.8? Я уже попробовал много различных версий, все приводящее к "аргументу аннотации должно быть константой", "недопустимый запуск простого выражения". Все эти определения не работают:

@Remote{val value = Array(classOf[MyEJBRemote])}
@Remote(val value = Array(classOf[MyEJBRemote]))
@Remote(Array(classOf[MyEJBRemote]))

9
задан Ingo Fischer 16 May 2010 в 12:01
поделиться

3 ответа

Вы правильно поняли синтаксис в своем ответе. Проблема в том, что аннотация @Remote использует необработанный тип Class , а не Class . Необработанные типы Java - неудачное следствие ограничений обратной совместимости от Java 1.4 до Java 1.5 и общий источник ошибок в компиляторе Scala.

Я обнаружил ошибку # 3429 , описывающую в основном ту же проблему, и добавил вашу конкретную проблему в качестве другого тестового примера.

Единственный обходной путь - взять исходный код из проблемной аннотации, заменить Class на Class , перекомпилировать их и поместить этот JAR перед путем к классам. в Скалак. Помимо этого, вы должны проголосовать за ошибку, добавив ваш адрес электронной почты в список CC.

6
ответ дан 4 December 2019 в 22:27
поделиться

Как всегда компетентный ответ... Спасибо! Это настоящий шоу-стоппер для использования Scala в javaEE-приложении. Изменение аннотации не вариант для меня. Интересно, почему это сработало с Scala 2.7x. На этой странице автор реализует аннотацию следующим образом:

@Remote {val value = Array(classOf[ITest])}
class TestBean extends ITest { ...

Которая, похоже, работает. К сожалению, Scala 2.7x также не вариант для меня...

1
ответ дан 4 December 2019 в 22:27
поделиться

Хорошо, я обнаружил, что вы МОЖЕТЕ использовать массив в качестве параметра аннотации, как показано здесь . В принципе, этот должен работать:

@Remote(value = Array(classOf[MyEJBRemote]))
class MyEJB extends MyEJBRemote {

Вот мой MyEJBRemote:

trait MyEJBRemote {
}

Итак, с массивом все в порядке, но моя следующая проблема - несоответствие типов, исходящее из classOf [MyEJBRemote] . Кажется, что невозможно использовать .class в качестве параметра аннотации. Это также обсуждалось здесь , но без какого-либо решения этого вопроса. Проведем дальнейшее расследование по этому поводу ...

1
ответ дан 4 December 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: