class AbstractMapper<T, INNER extends Expression<T>, MAPPER>
    implements MapperExpression<T, INNER, MAPPER> {
        final INNER inner;
        final MAPPER mapper;

        AbstractMapper(INNER inner, MAPPER mapper) {
            this.inner  = requireNonNull(inner);
            this.mapper = requireNonNull(mapper);
        }

        @Override
        public final INNER inner() {
            return inner;
        }

        @Override
        public final MAPPER mapper() {
            return mapper;
        }

        @Override
        public final boolean equals(Object o) {<FILL_FUNCTION_BODY>}

        @Override
        public final int hashCode() {
            return Objects.hash(inner(), mapper(), mapperType());
        }
    }

            if (this == o) return true;
            else if (!(o instanceof MapperExpression)) return false;
            final MapperExpression<?, ?, ?> that = (MapperExpression<?, ?, ?>) o;
            return Objects.equals(inner(), that.inner()) &&
                Objects.equals(mapper(), that.mapper()) &&
                Objects.equals(mapperType(), that.mapperType());
        
<no_super_class>