如何解决如何为Java批注提供符号?
似乎我的误解使我想到了这个问题。请帮助我解决它们。 chrylis -cautiouslyoptimistic指出,JLS 9.6.1指出“类或类的调用(第4.5节)”已作为注释类型涵盖。
我们都同意静态导入是一个常量(嗯,假装我没有声明:https://stackoverflow.com/a/9083023/1236128当然不是真的)
import static path.to.someFunction
我创建这样的注释
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.METHOD,ElementType.FIELD})
public @interface Testing {
Class<? extends Function> symbol();
}
给出一个静态函数(即使声明此最终结果也不能使someFunction
在Java中定义为常量,这使我不满意):
public static Function<Long,Long> someFunction = a -> b;
打扰一下(我意识到函数本身与其应用之间存在差异)
public static Function<Long,Long> someFunction = a -> 2L;
我这样创建一个单元测试(假设上述静态导入):
@Test
@Testing(symbol = someFunction)
void someFunctionTest() {
....
}
除了我的错误外,还有人认识到这在编译时会有多大用处吗?我可以在所有标有@Tested
的函数上使用反射,以查看是否确实在某处对其进行了测试(基于@Testing
批注)。
有趣的是,我为注释提供了一个常量,但这就是IntelliJ的抱怨:
属性值必须为[a]常量。
这是怎么回事?注释机制是试图执行该功能,还是将其接受为更高阶的功能?
解决方法
我们都同意静态导入是常量。
不,我们不。
静态导入无非是使字段/方法/ ...可以通过简单的名称进行访问,而不必使用完全限定的名称。
该简单名称可能是对常量字段的引用,也可能是对其他字段的引用。
您已将someFunction
定义为
public static Function<Long,Long> someFunction = a -> b;
根据不是a "constant expression"(强调我)的Java语言规则:
常量表达式是表示原始类型的值或字符串的表达式 [...]
很显然,Function
既不是原始值也不是String
。
此外,您已经将symbol
定义为采用Class<? extends Function>
,这意味着您需要为其分配一个实现Function
的类。 someFunction
不是Class
,而是碰巧实现Function
的实际对象。
总的回答是否,您不能这样做。而且您的代码由于多种原因而无法正常工作:
-
someFunction
不是编译时间常数 -
someFunction
不是Class<? extends Function>
期望的symbol
- 注释中不支持将实际类型
Function<?,?>
作为属性类型。
您不能照原样进行。 JLS 9.6.1:
以注释类型声明的方法的返回类型必须为以下之一,否则会发生编译时错误:
- 原始类型
- 字符串
- 类或类的调用(第4.5节)
- 枚举类型
- 注释类型
- 一种数组类型,其组件类型是上述类型之一(第10.1节)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。