@Override
      public TypeMirror visitTypeVariable(TypeVariable t, Void p) {
        Element element = t.asElement();
        if (element.getKind() == ElementKind.TYPE_PARAMETER) {
          TypeParameterElement e = (TypeParameterElement) element;
          if (typeBindings.containsKey(e)) {
            return visit(typeBindings.get(e));
          }
        }
        // We erase the upper bound to avoid infinite recursion. We can get away with erasure for
        // the reasons described above.
        return visit(typeUtils.erasure(t.getUpperBound()));
      }
Type elements that we are currently visiting. This helps us stay out of trouble when
looking at something like {@code Enum<E extends Enum<E>>}. At the second {@code Enum} we
will just return raw {@code Enum}.
common/src/main/java/com/google/auto/common/Overrides.java