And the point of the above was to say that Rule<X> and RuleEvaluation<X, Value> don't need to know what X is specifically, but they still want to be internally consistent - knowing that X is a specific type and that it is handed associated objects that also work with the correct type.