code: public void emitTypeVariables(List<TypeVariableName> typeVariables) throws IOException {
      if (typeVariables.isEmpty()) return;
  
      typeVariables.forEach(typeVariable -> currentTypeVariables.add(typeVariable.name));
  
      emit("<");
      boolean firstTypeVariable = true;
      for (TypeVariableName typeVariable : typeVariables) {
        if (!firstTypeVariable) emit(", ");
        emitAnnotations(typeVariable.annotations, true);
        emit("$L", typeVariable.name);
        boolean firstBound = true;
        for (TypeName bound : typeVariable.bounds) {
          emit(firstBound ? " extends $T" : " & $T", bound);
          firstBound = false;
        }
        firstTypeVariable = false;
      }
      emit(">");
    }
docs: Emit type variables with their bounds. This should only be used when declaring type variables;
  everywhere else bounds are omitted.