docs: public static Class<?> getInterestedEventType(Object subscriber, Method subMethod) {
          Class<?> interestedEventType = (DynamicSubscriber.class.isAssignableFrom(subscriber.getClass()))
                            ? ((DynamicSubscriber) subscriber).getEventType()
                            : subMethod.getParameterTypes()[0];/* The subscriber method must be valid here. */
          Subscribe annotation = subMethod.getAnnotation(Subscribe.class);
          if (annotation.batchingStrategy() != Subscribe.BatchingStrategy.None
              && Iterable.class.isAssignableFrom(interestedEventType)) {
              // Batch consumer, the parameter type of Iterable is the actual event type.
              Type[] genericMethodParams = subMethod.getGenericParameterTypes();
              ParameterizedType interestedEventParam = (ParameterizedType) genericMethodParams[0]; // Validation ensures that the argument is generic Iterable.
              Type[] iterableTypeParams = interestedEventParam.getActualTypeArguments();
              // Now we have the generic parameter for the Iterable, which essentially is always 1.
              if (iterableTypeParams[0] instanceof ParameterizedType) {
                  // This is the case where the Iterable paramter itself is a generic, eg:
                  // Iterable<List<String>>
                  // in such a case, the iterableTypeParams will not be the class of the interested event type.
                  return (Class<?>) ((ParameterizedType)iterableTypeParams[0]).getRawType();
              } else {
                  // The iterableTypeParams[0] itself is the class of the actual event.
                  return (Class<?>) iterableTypeParams[0];
              }
          } else {
              return interestedEventType;
          }
      }