class AbstractNonNullable
        <T, INNER extends Expression<T>, DEFAULT extends Expression<T>>
    implements OrElseGetExpression<T, INNER, DEFAULT> {

        final INNER inner;
        final DEFAULT getter;

        AbstractNonNullable(INNER inner, DEFAULT getter) {
            this.inner  = requireNonNull(inner);
            this.getter = requireNonNull(getter);
        }

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

        @Override
        public final DEFAULT defaultValueGetter() {
            return getter;
        }

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

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

            if (this == o) return true;
            if (!(o instanceof OrElseGetExpression)) return false;
            final OrElseGetExpression<?, ?, ?> that = (OrElseGetExpression<?, ?, ?>) o;
            return Objects.equals(inner, that.innerNullable()) &&
                Objects.equals(getter, that.defaultValueGetter());
        
<no_super_class>