DfType (@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; }