首页 文章

Scala 2.8:使用带有数组参数的Java注释

提问于
浏览
9

我正在尝试使用Scala 2.8实现JavaEE会话Bean .
因为它是一个远程会话Bean,我必须使用以下Java Annotation对其进行注释:

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

我只为scala 2.7找到this example . 在Scala 2.7中,可以像这样定义会话bean:

@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]))

3 回答

  • 1

    您的答案中的语法正确 . 问题是@Remote注释使用原始类型 Class 而不是 Class<?> . Java原始类型是从Java 1.4到Java 1.5的向后兼容性约束以及Scala编译器中常见错误源的不幸结果 .

    我发现bug #3429描述了基本相同的问题,并将您的特定问题添加为另一个测试用例 .

    唯一的解决方法是从有问题的注释中获取源代码,将 Class 替换为 Class<?> ,重新编译它们,并将该JAR放在类路径前面的Scalac中 . 除此之外,您应该投票选择将您的电子邮件添加到CC列表的错误 .

  • 6

    好的,我发现你可以使用数组作为注释参数,如here . 原则上,这应该工作:

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

    这是我的MyEJBRemote:

    trait MyEJBRemote {
    }
    

    所以阵列没问题,但我的下一个问题是来自 classOf[MyEJBRemote] 的类型不匹配 . 因为看起来不可能将.class作为注释参数 . 这也被讨论过here,没有任何解决方案 . 将对此进行进一步调查......

  • 1

    一如既往的胜利答案......谢谢!这是在JavaEE应用程序中使用Scala的真正显示器 . 更改注释不适合我 . 我想知道为什么它适用于Scala 2.7x . 在this page上,作者实现了这样的注释:

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

    这似乎有效 . 不幸的是,Scala 2.7x对我来说也不是一个选择......

相关问题