code: public static TypeMirror hasGenericsTypeArgumentOf(Element element, String typeToCheck,
                                                       Elements elements, Types types) {
  
      if (element.asType().getKind() != TypeKind.DECLARED
          || !(element.asType() instanceof DeclaredType)) {
        ProcessorMessage.error(element, "The field %s in %s doesn't have generic type arguments!",
            element.getSimpleName(), element.asType().toString());
      }
  
      DeclaredType declaredType = (DeclaredType) element.asType();
      List<? extends TypeMirror> typeArguments = declaredType.getTypeArguments();
  
      if (typeArguments.isEmpty()) {
        ProcessorMessage.error(element, "The field %s in %s doesn't have generic type arguments!",
            element.getSimpleName(), element.asType().toString());
      }
  
      if (typeArguments.size() > 1) {
        ProcessorMessage.error(element, "The field %s in %s has more than 1 generic type argument!",
            element.getSimpleName(), element.asType().toString());
      }
  
      // Ok it has a generic argument, check if this extends Parcelable
      TypeMirror argument = typeArguments.get(0);
  
      if (typeToCheck != null) {
        if (!isOfType(argument, typeToCheck, elements, types)) {
          ProcessorMessage.error(element,
              "The fields %s  generic type argument is not of type  %s! (in %s )",
              element.getSimpleName(), typeToCheck, element.asType().toString());
        }
      }
  
      // everything is like expected
      return argument;
    }
docs: Checks if the variabel element has generics arguments that matches the expected type