【问题标题】:Groovy character literal for annotation metadata?注释元数据的 Groovy 字符文字?
【发布时间】:2015-10-08 12:14:06
【问题描述】:

我想在 Groovy 中测试我的 Java 自定义注释,但由于字符问题而没有管理它。

Groovyc:期望 'a' 是 char 类型的内联常量,而不是 @MyAnnotation 中的字段表达式

我知道groovy中的char被指定为

'a' as char

我的Java自定义注解

@Target({FIELD})
@Retention(RUNTIME)
@Documented
public @interface MyAnnotation {

    char someChar() default '#';

}

不工作 Groovy 代码

class Foo {

    @MyAnnotation(someChar = 'a' as char)
    Object hoo

}

如果将 char 提取为常量,它也不起作用。

【问题讨论】:

  • char 在 Groovy 语言中处于不利地位,在大多数情况下占主导地位的是 String 的形式
  • 看来不把类型改成String就不行了:/

标签: java groovy annotations


【解决方案1】:

这是一个棘手的问题......我发现工作是:

import java.lang.annotation.Documented
import java.lang.annotation.ElementType
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
import java.lang.annotation.Target
import groovy.transform.CompileStatic

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {

    char someChar() default ('#' as char);

}

@CompileStatic
class Foo {

    @MyAnnotation(someChar =( (char)'a'))
    Object hoo

}

其中重要的部分是注解定义中的as char(除非那是Java而不是Groovy),注解使用中的char转换,而不是as char,而是一个硬转换以及制作该类@987654325 @。这似乎对我有用,但是如果您可以访问注释代码,您也可以将其更改为字符串,因为我认为使用字符串可以更简单地工作。

【讨论】:

  • 我没有足够强调测试下的代码是 Java,问题已编辑。
  • 我认为我的建议中的用法部分仍然有效。启动笔记本电脑后,我会尝试一下。
  • 是的,即使注释类是 Java 并且 Foo 类是 Groovy,我的答案也有效。您的 IDE 可能不喜欢它 - IntelliJ 将 (char)'a' 标记为错误,但它编译得很好。
  • 是的,你是对的,我使用的是 IntellJ Idea 14.1.5、Java 1.8.0_45 64 位和 Groovy 2.4.4,但与你不同的是,它不会为我编译。
  • 很奇怪——我的规格和你的几乎一模一样。
猜你喜欢
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 2014-03-03
  • 1970-01-01
  • 2014-02-08
  • 2012-02-05
  • 2020-02-07
相关资源
最近更新 更多