docs: @Requires("element != null")
    @Ensures("result != null")
    TypeName getGenericTypeName(TypeParameterElement element) {
      String name = element.getSimpleName().toString();
      List<? extends TypeMirror> bounds = element.getBounds();
      if (bounds.isEmpty()
          || (bounds.size() == 1
              && bounds.get(0).toString().equals("java.lang.Object"))) {
        return new TypeName(name);
      }
  
      StringBuilder buffer = new StringBuilder();
      buffer.append(name);
      buffer.append(" extends ");
  
      Iterator<? extends TypeMirror> iter = bounds.iterator();
      for (;;) {
        buffer.append(iter.next().toString());
        if (!iter.hasNext()) {
          break;
        }
        buffer.append(" & ");
      }
  
      return new TypeName(buffer.toString());
    }