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

时间:2011-01-07 14:52:54

标签: java annotations

我从未遇到过这种情况,现在我想知道:当两个不同的注释具有相同名称时会发生什么? (我将在这里使用IntelliJ提供的注释给出一个例子,但这个问题非常通用,所以我没有标记它'IntelliJ')

例如这里的第一句话:

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

表示:

  

许多图书馆都有自己的@NotNull   注释(intellij,   hibernate-validation,..)。

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

它们不兼容吗?如果它们不兼容,是否适用于整个项目?

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

5 个答案:

答案 0 :(得分:8)

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

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

  

Nullness注释(例如,@ NonNull   和@CheckForNull)。 FindBugs和   IntelliJ已经支持他们自己了   nullness注释的版本。

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

他们没有,因为完整的包是名称的一部分。结果是您只能导入一个,并且必须使用其完全限定名称引用任何其他名称。像这样

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

对于具有相同名称的两个类/ interafces / enums / annotations,问题是相同的。它们应该出现在不同的包中。如果它们在同一个包(例如不同的版本)但是不同的jar /目录中,则选择在类路径中找到的第一个。