代码之家  ›  专栏  ›  技术社区  ›  Wolkenarchitekt

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

  •  9
  • Wolkenarchitekt  · 技术社区  · 14 年前

    我正在尝试用scala 2.8实现一个Javaee会话bean。
    因为它是一个远程会话bean,所以我必须用下面的Java注释注释它:

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

    我只找到 this example 对于Scala 2.7。 在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 回复  |  直到 14 年前
        1
  •  6
  •   retronym    14 年前

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

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

    唯一的解决方法是从有问题的注释中获取源代码,替换 等级 具有 班级?gt; ,重新编译它们,并将jar放在scalac的类路径前面。除此之外,您应该投票赞成将您的电子邮件添加到CC列表的bug。

        2
  •  1
  •   Community prosti    7 年前

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

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

    这是我的myejbRemote:

    trait MyEJBRemote {
    }
    

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

        3
  •  1
  •   Wolkenarchitekt    14 年前

    像往常一样,一个称职的回答…谢谢您! 这是在JavaEE应用程序中使用scala的一个真正的ShowStopper。更改注释对我来说不是一个选项。 我想知道为什么它与scala 2.7x.on. this page 作者实现如下注释:

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

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