import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; // Direct inheritance tests class UnmarkedSuper { void method(String param) {} void methodWithTwoParams(String first, String second) {} } @NullMarked class NullMarkedSubclass extends UnmarkedSuper { @Override void method(String param) {} @Override void methodWithTwoParams(String first, String second) {} } @NullMarked class NullMarkedSubclassWithNullable extends UnmarkedSuper { @Override void method(@Nullable String param) {} } @NullMarked class NullMarkedSuper { void method(String param) {} } @NullMarked class NullMarkedSubclass2 extends NullMarkedSuper { @Override void method(String param) {} } // Indirect inheritance test interface UnmarkedInterface { void interfaceMethod(String param); } @NullMarked class NullMarkedBase { public void interfaceMethod(String param) {} // effectively non-null via @NullMarked } abstract class IndirectSubclass extends NullMarkedBase implements UnmarkedInterface {} // Multi-level inheritance test class UnmarkedBase2 { void chainMethod(String param) {} } class UnmarkedIntermediate extends UnmarkedBase2 { @Override void chainMethod(String param) {} } @NullMarked class NullMarkedChainEnd extends UnmarkedIntermediate { @Override void chainMethod(String param) {} }