package java.lang; @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 void foo6(Object a) { } public boolean equals(Object o) { } // compliant } class C extends A { @Override void foo1(@javax.annotation.Nonnull Object a) { } @Override void foo2(@javax.annotation.Nonnull Object a) { } @Override void foo3(@javax.annotation.Nullable Object a) { } @javax.annotation.Nonnull void foo4(Object a) { } @javax.annotation.Nonnull void foo5(Object a) { } @javax.annotation.Nullable void foo6(Object a) { } public boolean equals(@javax.annotation.Nonnull Object o) { } } class D extends Unknown { @Override void foo(@javax.annotation.Nonnull Object a) { } // compliant : we cannot check the overriden method }