import java.util.AbstractSet; import java.util.Set; interface Ancestor {} interface Subject extends Ancestor {} class Descendant implements Subject {} class Type { private Set<Subject> myField; public void meth() { Set<Subject> ancestors = null; myField = ancestors; Set<Subject> ancestorExtends = null; myField = ancestorExtends; Set<Subject> ancestorSupers = null; myField = ancestorSupers; // turning everything into Set<Subject> is actually too strict, but correct Set<Subject> subjects = null; myField = subjects; Set<Subject> subjectExtends = null; myField = subjectExtends; Set<Subject> subjectSupers = null; myField = subjectSupers; Set<Subject> descendants = null; myField = descendants; Set<Subject> descendantExtends = null; myField = descendantExtends; Set<Subject> descendantSupers = null; myField = descendantSupers; Set set = null; myField = set; AbstractSet<Subject> myCollection = null; myField = myCollection; } }