code: private static String getGenericTypeData(Type genericType) {
      List<String> types = Lists.newArrayList();
      if (genericType != null && genericType instanceof ParameterizedType) {
        for (Type t : ((ParameterizedType) genericType).getActualTypeArguments()) {
          if (t instanceof ParameterizedType) {
            String nestedGeneric = ((Class<?>) ((ParameterizedType) t).getRawType()).getSimpleName();
            nestedGeneric += getGenericTypeData(t);
            types.add(nestedGeneric);
          } else {
            types.add(((Class<?>) t).getSimpleName());
          }
        }
      }
      return (types.size() > 0) ? "<" + Joiner.on(", ").join(types) + ">" : "";
    }
docs: Extract the generic type information <...>, recursively including any nested generic type info.