code: public Class getIndexedPropertyKeyType(String propertyName) {
  		if (!PropertyAccessorUtils.isIndexedProperty(propertyName)) {
  			throw new IllegalArgumentException("'" + propertyName + "' is no indexed property");
  		}
  		Class type = getPropertyType(getParentPropertyName(propertyName));
  		if (!Map.class.isAssignableFrom(type)) {
  			return Integer.class;
  		}
  		if (JdkVersion.getMajorJavaVersion() >= JdkVersion.JAVA_15) {
  			int nestingLevel = PropertyAccessorUtils.getNestingLevel(propertyName) - 1;
  			Member accessor = getPropertyAccessor(getRootPropertyName(propertyName));
  			if (accessor instanceof Field) {
  				return GenericCollectionTypeResolver.getMapKeyFieldType((Field) accessor, nestingLevel);
  			}
  			else if (accessor instanceof Method) {
  				MethodParameter parameter = new MethodParameter((Method) accessor, ((Method) accessor)
  						.getParameterTypes().length - 1, nestingLevel);
  				return GenericCollectionTypeResolver.getMapKeyParameterType(parameter);
  			}
  			else {
  				throw new InvalidPropertyException(getTargetClass(), propertyName, "property not accessable");
  			}
  		}
  		else {
  			return String.class; // the default for Java 1.4
  		}
  	}
docs: Determine the type of the key used to index the collection/map. When jdk
  is at least 1.5, maps can be specified with generics and their key type
  can be resolved.
  
  @param propertyName name of the property.
  @return the type of the key. An integer if it's not a map, {@link String}
  if the jdk is less than 1.5, a specific type if the map was generified.