@Override
  default @Nullable DfType tryJoinExactly(@NotNull DfType other) {
    if (other == DfType.BOTTOM) return this;
    if (other == DfType.TOP) return other;
    if (!(other instanceof DfIntegralType)) return null;
    if (((DfIntegralType)other).getLongRangeType() != getLongRangeType()) return null;
    LongRangeSet range = ((DfIntegralType)other).getRange().tryJoinExactly(getRange());
    LongRangeSet wideRange = ((DfIntegralType)other).getWideRange().tryJoinExactly(getWideRange());
    if (range == null || wideRange == null) return null;
    return DfTypes.range(range, wideRange, getLongRangeType());
  }
@Override
  default @Nullable DfType tryJoinExactly(@NotNull DfType other)