【问题标题】:Scala 2.8: use Java annotation with an array parameterScala 2.8:使用带有数组参数的 Java 注释
【发布时间】:2010-05-16 00:17:19
【问题描述】:

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

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

【问题讨论】:

    标签: scala scala-2.8


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      这是我的 MyEJBRemote:

      trait MyEJBRemote {
      }
      

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

      【讨论】:

        【解决方案3】:

        一如既往的有能力的答案...谢谢! 这是在 JavaEE 应用程序中使用 Scala 的真正亮点。更改注释不是我的选择。 我想知道为什么它适用于 Scala 2.7x。在this page,作者实现了这样的注解:

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

        这似乎有效。不幸的是,Scala 2.7x 也不是我的选择......

        【讨论】:

          猜你喜欢
          • 2011-01-27
          • 1970-01-01
          • 2011-02-27
          • 1970-01-01
          • 2012-05-07
          • 1970-01-01
          • 1970-01-01
          • 2018-09-29
          • 1970-01-01
          相关资源
          最近更新 更多