@Override
  public boolean isSuperType(@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;
  }
@Override
  public boolean isSuperType(@NotNull DfType other)