包含其他注释的注释成员?

iva*_*off 8 java annotations

我想创建一个自定义注释(使用Java),它将接受其他注释作为参数,如:

public @interface ExclusiveOr {
    Annotation[] value();
}
Run Code Online (Sandbox Code Playgroud)

但这会导致编译器错误"注释成员的无效类型".

对象[]也不起作用.

有办法做我想要的吗?

Mic*_*ers 5

产生错误是因为您不能将接口用作注释值(将其更改为Comparable,您将得到相同的错误).来自JLS:

如果在注释类型中声明的方法的返回类型是除以下之一之外的任何类型,则为编译时错误:其中一个基本类型String,Class以及任何调用Class,枚举类型,注释类型或前面类型之一的数组.如果在注释类型中声明的任何方法具有覆盖等同于在类或接口中声明的任何publicprotected方法的签名,则它也是编译时错误.Objectannotation.Annotation

我担心我不知道一个好的解决方法,但现在至少你知道为什么你会得到错误.


iva*_*off 2

我本人特此针对给定问题提出一个解决方法:

嗯,我想让这样的事情成为可能:

@Contract({
    @ExclusiveOr({
        @IsType(IAtomicType.class),
        @Or({
            @IsType(IListType.class),
            @IsType(ISetType.class)
        })
    })
})
Run Code Online (Sandbox Code Playgroud)

建议的解决方法:

通过以下方式定义一个具有无参数构造函数的类(稍后将由您自己的注释处理器调用):

final class MyContract extends Contract{
    // parameter-less ctor will be handeled by annotation processor
    public MyContract(){
        super(
            new ExclusiveOr(
                new IsType(IAtomicType.class),
                new Or(
                    new IsType(IListType.class),
                    new IsType(ISetType.class)
                )
            )
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

@Contract(MyContract.class)
class MyClass{
    // ...
}
Run Code Online (Sandbox Code Playgroud)