code: public <T> T parse(String input, GenericType<T> genericType) {
          if (input == null) {
              throw new NullPointerException(makeNullArgumentErrorMsg("input"));
          }
          if (genericType == null) {
              throw new NullPointerException(makeNullArgumentErrorMsg("genericType"));
          }
  
          @SuppressWarnings("unchecked")
          T temp = (T) parseType2(input, new TargetType(genericType.getType()));
          return temp;
      }
docs: Parses the given {@code input} string to the given {@code genericType}.
  <p/>
  Example: <br/>
  <code>
  TypeParser parser = TypeParser.newBuilder().build();<br/>
  {@code List<Integer>} list = parser.parse("1, 2", new {@code GenericType<List<Integer>>}() {});
  </code><br/>
  Note the ending "{}".
  
  @param input - string value to parse.
  @param genericType - the expected generic type to convert {@code input} to.
  @return an instance of {@code genericType} corresponding to the given {@code input}.
  @throws NullPointerException if any given argument is {@code null}.
  @throws TypeParserException if anything goes wrong while parsing {@code input} to the given
  {@code targetType}.
  @throws NoSuchRegisteredParserException if there is no registered {@link Parser} for the
  given {@code targetType}.