Java数组参数注解疑问:@Foo标注String还是String[]?
数组类型的注解目标解析
先从你给出的例子说起,你已经明确知道在try (@Foo Stream<@Bar Baz> foo = blabla) { }里,@Bar标注的是泛型元素Baz,@Foo标注的是外层的Stream类型,这个理解完全正确。
那回到你疑惑的数组代码:
void whatever(@Foo String[] args) { }
这里的@Foo是直接标注在String[]这个数组类型本身上的,而不是数组里的String元素。
为什么要明确这个?就像你提到的@NotNull的场景:
@NotNull List<String>表示列表对象本身非空,但元素可能为空;List<@NotNull String>表示列表对象可能为空,但所有元素都是非空的。
而数组的注解语法和泛型有区别,但同样可以精准控制注解的目标:
- 如果要标注数组对象本身非空,写法就是
@NotNull String[] args(或者等价的String @NotNull [] args,两种写法语义一致,都是注解数组类型); - 如果要标注数组里的每个元素非空,需要把注解放在数组括号的前面,也就是
String @NotNull [] args; - 要是你想同时实现「数组本身非空 + 元素也非空」,可以把两个注解组合起来,写成
@NotNull String @NotNull [] args,这样就和泛型的@NotNull List<@NotNull String>语义完全对应了。
简单来说,数组类型的注解位置决定了它的作用目标:放在[]前面靠近元素类型的位置,就是注解元素;放在整个数组类型的最前面,就是注解数组对象本身。
内容的提问来源于stack exchange,提问作者ice1000
相关产品推荐
相关产品推荐

