import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.checkerframework.checker.nullness.qual.*; class MethodTypeVars3 { public static <@KeyFor("#1") T extends @KeyFor("#1") Object> Map<T, List<T>> dominators( Map<T, List<T>> preds) { List<T> nodes = new ArrayList<T>(preds.keySet()); // Compute roots & non-roots, for convenience List<@KeyFor("preds") T> roots = new ArrayList<@KeyFor("preds") T>(); List<@KeyFor("preds") T> non_roots = new ArrayList<@KeyFor("preds") T>(); Map<@KeyFor("preds") T, List<T>> dom = new HashMap<@KeyFor("preds") T, List<T>>(); // Initialize result: for roots just the root, otherwise everything for (@KeyFor("preds") T node : preds.keySet()) { if (preds.get(node).isEmpty()) { // This is a root roots.add(node); // Its only dominator is itself. Set<@KeyFor("preds") T> set = Collections.singleton(node); dom.put(node, new ArrayList<T>(set)); dom.put(node, new ArrayList<T>(Collections.singleton(node))); } else { non_roots.add(node); dom.put(node, new ArrayList<T>(nodes)); } } return dom; } <XXX extends Object> void test(Map<XXX, List<XXX>> dom, XXX node) { dom.put(node, new ArrayList<XXX>(Collections.singleton(node))); } }