class AbstractSpecification implements Specification {

    @Override
    @SuppressWarnings({ "unchecked" })
    public final String satisfies(final Object obj) {
        if (obj == null) {
            return nullability == Nullability.IGNORE_IF_NULL ? null : "Cannot be null";
        }
        if (!expectedType.isInstance(obj)) {
            return typeChecking == TypeChecking.IGNORE_INCORRECT_TYPE ? null : "Incorrect type";
        }
        final T objAsT = (T) obj;
        return satisfiesSafely(objAsT);
    }

    protected  AbstractSpecification();
    protected  AbstractSpecification(final Nullability nullability, final TypeChecking typeChecking);

}