code: protected void discover(final Mapper mapper) {
          for (final Class<? extends Annotation> clazz : INTERESTING) {
              addAnnotation(clazz);
          }
  
          //type must be discovered before the constructor.
          discoverType(mapper);
          constructor = discoverConstructor();
          discoverMultivalued();
  
          // check the main type
          isMongoType = ReflectionUtils.isPropertyType(realType);
  
          // if the main type isn't supported by the Mongo, see if the subtype is.
          // works for T[], List<T>, Map<?, T>, where T is Long/String/etc.
          if (!isMongoType && subType != null) {
              isMongoType = ReflectionUtils.isPropertyType(subType);
          }
  
          if (!isMongoType && !isSingleValue && (subType == null || subType == Object.class)) {
              if (LOG.isWarnEnabled() && !mapper.getConverters().hasDbObjectConverter(this)) {
                  LOG.warn(format("The multi-valued field '%s' is a possible heterogeneous collection. It cannot be verified. "
                                     + "Please declare a valid type to get rid of this warning. %s", getFullName(), subType));
              }
              isMongoType = true;
          }
      }
docs: Discovers interesting (that we care about) things about the field.