boolean (@NotNull DfType other) { if (other == BOTTOM) return true; if (other instanceof DfNullConstantType) { return getNullability() != DfaNullability.NOT_NULL; } if (!(other instanceof DfReferenceType type)) return false; if (!myNotValues.isEmpty()) { if (other instanceof DfReferenceConstantType) { if (myNotValues.contains(((DfReferenceConstantType)other).getValue())) { return false; } } else if (other instanceof DfGenericObjectType) { if (!((DfGenericObjectType)other).myNotValues.containsAll(myNotValues)) { return false; } } else return false; } if (isLocal() && !type.isLocal() && !getConstraint().isComparedByEquals()) return false; if (type.getNullability() != getNullability() && getNullability() != DfaNullability.UNKNOWN && type.getNullability() != DfaNullability.NOT_NULL) return false; if (!getConstraint().isSuperConstraintOf(type.getConstraint())) return false; if (getMutability().join(type.getMutability()) != getMutability()) return false; SpecialField sf = getSpecialField(); if (sf != null) { if (sf != type.getSpecialField()) return false; if (!getSpecialFieldType().isSuperType(type.getSpecialFieldType())) return false; } return true; }