code: public boolean containedBy(Type t, Type s) {
          switch (t.getTag()) {
          case UNDETVAR:
              if (s.hasTag(WILDCARD)) {
                  UndetVar undetvar = (UndetVar)t;
                  WildcardType wt = (WildcardType)s;
                  switch(wt.kind) {
                      case UNBOUND:
                          break;
                      case EXTENDS: {
                          Type bound = wildUpperBound(s);
                          undetvar.addBound(InferenceBound.UPPER, bound, this);
                          break;
                      }
                      case SUPER: {
                          Type bound = wildLowerBound(s);
                          undetvar.addBound(InferenceBound.LOWER, bound, this);
                          break;
                      }
                  }
                  return true;
              } else {
                  return isSameType(t, s);
              }
          case ERROR:
              return true;
          default:
              return containsType(s, t);
          }
      }
docs: <editor-fold defaultstate="collapsed" desc="Contains Type">