import org.checkerframework.checker.nullness.qual.*; public class VoidUse { // Void is treated as Nullable, therefore also Class<Void> // is Nullable. Should this fail? The upper bound of the // wildcard is implicitly Nullable (because of the bound in // Class), therefore it passes. private Class<?> main_class1 = Void.TYPE; private Class<? extends @Nullable Object> main_class2 = Void.TYPE; public Void voidReturn(Void p) { voidReturn(null); return null; } // Void is treated as Nullable. Is there a value on having it be // NonNull? public abstract static class VoidTestNode<T extends Object> {} public static class VoidTestInvNode extends VoidTestNode<@NonNull Void> {} class Scanner<P extends Object> { public void scan(Object tree, P p) {} } //:: error: (type.argument.type.incompatible) class MyScanner extends Scanner<Void> { void use(MyScanner ms) { ms.scan(new Object(), null); } } //:: error: (type.argument.type.incompatible) class MyScanner2 extends Scanner<@Nullable Object> { void use(MyScanner2 ms) { ms.scan(new Object(), null); } } // Test case for issue #230 Class<? extends @Nullable Object> voidClass() { return void.class; } Class<? extends @Nullable Object> VoidClass() { return Void.class; } Class<?> intClass() { return int.class; } Class<?> ListClass() { return java.util.List.class; } }