import java.io.*;
import java.util.HashMap;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.*;

class Cell<T extends @Nullable Object> {
  void add(T arg) {}
}

public class GenericArgs2 {
  static <F extends Object> void test1(Cell<F> collection) {
    // :: error: (argument)
    collection.add(null); // should fail
  }

  static <F extends @Nullable Object> void test2(Cell<F> collection) {
    // :: error: (argument)
    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;

  public GenericArgs2(
      HashMap<Class<? extends InvariantFilter>, Map<Class<? extends Invariant>, Integer>>
          filter_map1,
      MyMap<@Nullable Class<? extends InvariantFilter>, Map<Class<? extends Invariant>, Integer>>
          filter_map2) {
    this.filter_map1 = filter_map1;
    this.filter_map2 = filter_map2;
  }

  class MyMap<K extends @Nullable Object, V extends @Nullable Object> {}
}
