Ответ 1
Вы также должны переопределить метод hashCode
в классе C
. Например:
@Override
public int hashCode() {
return n.hashCode();
}
Когда два объекта C
равны, их методы hashCode
должны возвращать одинаковое значение.
Документация API для интерфейса Stream
не упоминает об этом, но хорошо известно, что если вы переопределяете equals
, вы также должны переопределить hashCode
. В документации API для Object.equals()
упоминается следующее:
Обратите внимание, что обычно необходимо переопределять метод
hashCode
всякий раз, когда этот метод переопределяется, чтобы поддерживать общий контракт для методаhashCode
, который утверждает, что равные объекты должны иметь одинаковые хэш-коды.
По-видимому, Stream.distinct()
действительно использует хэш-код объектов, потому что, когда вы реализуете его, как я показал выше, вы получаете ожидаемый результат: 2.