当两个不同的注解具有相同的名称时会发生什么?

6

我从未遇到过这种情况,现在我想知道:如果两个不同的注释具有相同的名称会发生什么?(我将在此处提供一个由IntelliJ提供的注释示例,但问题实际上是通用的,因此我不会标记它为“IntelliJ”)

例如,在这里第一句话:

http://youtrack.jetbrains.net/issue/IDEABKL-4959

说:

许多库都有自己的@NotNull注释(例如intellij,hibernate-validation等)。

如果我想同时使用IntelliJ的@NotNull和Hibernate的@NotNull,会发生什么?(再次说明@NotNull只是我碰巧找到冲突的一个例子)

它们是否不兼容?如果不兼容,整个项目都是这样吗?

这是我真的不熟悉的东西...

5个回答

10

在这种情况下,您需要指定完全限定名称,例如

@bar.baz.Foo 
@org.fubar.Foo
void myMethod() {...}

8

没有歧义,因为注释的包名将在导入或注释本身中指定。

JSR-305 解决了您的具体示例。 它寻求一组标准注释,并特别提到了FindBugs和IntelliJ的可空性注释。

空值注释(例如,@NonNull和@CheckForNull)。 FindBugs和IntelliJ已经支持它们自己的版本的空值注释。


2

他们不这样做,因为完整的包名是名称的一部分。这意味着您只能导入一个,并且必须使用其完全限定名称来引用任何其他内容。就像这样

@NotNull
@com.jetbrains.annotations.NotNull
public Object ...

1
+1... 哎呀。使用完全限定名称看起来确实很丑/啰嗦 :-/ - Gugussee

1

这并不重要,因为每个注释的完全限定名称都不同。您可以在import部分声明限定名称。


0
问题出在两个具有相同名称的类/接口/枚举/注解上。它们应该出现在不同的包中。如果它们在同一个包中(例如不同版本),但是在不同的jar/目录中,则会选择在类路径中找到的第一个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接