import checkers.nullness.quals.*; import java.io.*; import java.util.*; class Cell<T extends @Nullable Object> { void add(T arg) { } } class GenericArgs2 { static <F extends Object> void test1(Cell<F> collection) { //:: (argument.type.incompatible) collection.add(null); // should fail } static <F extends @Nullable Object> void test2(Cell<F> collection) { //:: (argument.type.incompatible) collection.add(null); // should fail } static void test3(Cell<@Nullable Object> collection) { collection.add(null); // valid } // No "<F super Object>" version of the above, as that is illegal in Java. static class InvariantFilter { } static class Invariant { } HashMap<Class<? extends InvariantFilter>,Map<Class<? extends Invariant>,Integer>> filter_map1; MyMap<@Nullable Class<? extends InvariantFilter>,Map<Class<? extends Invariant>,Integer>> filter_map2; class MyMap<K extends @Nullable Object, V extends @Nullable Object> {} }