public static boolean isExtendedMap(Class objectClass) {
        if (objectClass == HashMap.class
                || objectClass == LinkedHashMap.class
                || objectClass == TreeMap.class
                || objectClass.getSimpleName().isEmpty()
        ) {
            return false;
        }

        Class superclass = objectClass.getSuperclass();
        if (superclass != HashMap.class
                && superclass != LinkedHashMap.class
                && superclass != TreeMap.class
        ) {
            return false;
        }

        Constructor defaultConstructor = getDefaultConstructor(objectClass, false);
        if (defaultConstructor != null) {
            return false;
        }

        List<Field> fields = new ArrayList<>();
        BeanUtils.declaredFields(objectClass, field -> {
            int modifiers = field.getModifiers();
            if (Modifier.isStatic(modifiers)
                    || Modifier.isTransient(modifiers)
                    || field.getDeclaringClass().isAssignableFrom(superclass)
                    || "this$0".equals(field.getName())
            ) {
                return;
            }

            fields.add(field);
        });

        return !fields.isEmpty();
    }
The WildcardType interface supports multiple upper bounds and multiple
lower bounds. We only support what the Java 6 language needs - at most one
bound. If a lower bound is set, the upper bound must be Object.class.
core/src/main/java/com/alibaba/fastjson2/util/BeanUtils.java