import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; class Foo { public void main(@NotNull Object nn) { foo(nn).hashCode(); } @Contract("null->null;!null->!null") @Nullable Object foo(Object a) { return a; } @NotNull Object notNull() { return nullable(false); } @NotNull Object notNull2() { return nullable2(false); } @Nullable @Contract("true -> !null") Object nullable(boolean notNull) { return notNull ? "" : anotherNullable(); } @Nullable @Contract("true -> !null; _->_") Object nullable2(boolean notNull) { return notNull ? "" : anotherNullable(); } @Nullable Object anotherNullable() { return null; } }