@Override
    public @NotNull TypeConstraint join(@NotNull TypeConstraint other) {
      if (isSuperConstraintOf(other)) return this;
      if (other.isSuperConstraintOf(this)) return other;
      if (other instanceof Constrained) {
        return joinWithConstrained((Constrained)other);
      }
      if (other instanceof Exact) {
        return joinWithConstrained(new Constrained(Collections.singleton((Exact)other), Collections.emptySet()));
      }
      return TOP;
    }
@Override
    public @NotNull TypeConstraint join(@NotNull TypeConstraint other)