DfType (@NotNull DfType other) { if (other.isSuperType(this)) return this; if (other instanceof DfEphemeralReferenceType) return BOTTOM; if (other instanceof DfGenericObjectType) { DfReferenceType type = ((DfReferenceType)other).dropMutability(); if (type.isSuperType(this)) return this; TypeConstraint constraint = type.getConstraint().meet(myConstraint); if (constraint != TypeConstraints.BOTTOM) { DfReferenceConstantType subConstant = new DfReferenceConstantType(getValue(), constraint, myDropConstantOnWiden); if (type.isSuperType(subConstant)) return subConstant; } } return BOTTOM; }