@Override
  public @NotNull DfType meet(@NotNull DfType other) {
    if (other == DfType.TOP) return this;
    if (other == DfType.BOTTOM) return other;
    if (other instanceof DfEphemeralReferenceType ||
        other instanceof DfGenericObjectType) {
      TypeConstraint otherConstraint = ((DfReferenceType)other).getConstraint();
      TypeConstraint constraint = myTypeConstraint.meet(otherConstraint);
      return constraint == myTypeConstraint ? this :
             constraint == otherConstraint ? other :
             constraint == TypeConstraints.BOTTOM ? DfType.BOTTOM :
             new DfEphemeralReferenceType(constraint);
    }
    return DfType.BOTTOM;
  }
@Override
  public @NotNull DfType meet(@NotNull DfType other)