code: public Class<?> getCommonPropertyType(ELContext context,
                                                 Object base) {
          Class<?> commonPropertyType = null;
          for (int i = 0; i < size; i++) {
  
              Class<?> type = elResolvers[i].getCommonPropertyType(context, base);
              if (type == null) {
                  // skip this EL Resolver
                  continue;
              } else if (commonPropertyType == null) {
                  commonPropertyType = type;
              } else if (commonPropertyType.isAssignableFrom(type)) {
                  continue;
              } else if (type.isAssignableFrom(commonPropertyType)) {
                  commonPropertyType = type;
              } else {
                  // Don't have a commonPropertyType
                  return null;
              }
          }
          return commonPropertyType;
      }
docs: Returns the most general type that this resolver accepts for the
  <code>property</code> argument, given a <code>base</code> object.
  One use for this method is to assist tools in auto-completion. The
  result is obtained by querying all component resolvers.
  
  <p>The <code>Class</code> returned is the most specific class that is
  a common superclass of all the classes returned by each component
  resolver's <code>getCommonPropertyType</code> method. If
  <code>null</code> is returned by a resolver, it is skipped.</p>
  
  @param context The context of this evaluation.
  @param base The base object to return the most general property
  type for, or <code>null</code> to enumerate the set of
  top-level variables that this resolver can evaluate.
  @return <code>null</code> if this <code>ELResolver</code> does not
  know how to handle the given <code>base</code> object; otherwise
  <code>Object.class</code> if any type of <code>property</code>
  is accepted; otherwise the most general <code>property</code>
  type accepted for the given <code>base</code>.