package javax.annotation; @interface CheckForNull {} @interface Nonnull {} @interface Nullable {} class A { void foo1(@javax.annotation.Nullable Object a) { } void foo2(@javax.annotation.CheckForNull Object a) { } void foo3(@javax.annotation.Nonnull Object a) { } @javax.annotation.CheckForNull void foo4(Object a) { } @javax.annotation.Nullable void foo5(Object a) { } @javax.annotation.Nonnull void foo6(Object a) { } } class B extends A { @Override void foo1(@javax.annotation.CheckForNull Object a) { } @Override void foo2(@javax.annotation.Nullable Object a) { } @Override void foo3(@javax.annotation.CheckForNull Object a) { } @javax.annotation.Nullable void foo4(Object a) { } @javax.annotation.CheckForNull void foo5(Object a) { } @javax.annotation.CheckForNull // Noncompliant void foo6(Object a) { } public boolean equals(Object o) { } // compliant } class C extends A { @Override void foo1(@javax.annotation.Nonnull @MyAnnotation Object a) { } // Noncompliant {{Remove this "Nonnull" annotation to honor the overridden method's contract.}} @Override void foo2(@javax.annotation.Nonnull Object a) { } // Noncompliant @Override void foo3(@javax.annotation.Nullable Object a) { } @javax.annotation.Nonnull @Deprecated void foo4(Object a) { } @javax.annotation.Nonnull void foo5(Object a) { } @Deprecated @javax.annotation.Nullable // Noncompliant [[sc=5;ec=31]] {{Remove this "Nullable" annotation to honor the overridden method's contract.}} void foo6(Object a) { } public boolean equals(@javax.annotation.Nonnull Object o) { } // Noncompliant {{Equals method should accept null parameters and return false.}} } class D extends Unknown { @Override void foo(@javax.annotation.Nonnull Object a) { } // compliant : we cannot check the overriden method } @interface MyAnnotation {}