Java: контракты методов equals и hashCode - PullRequest
0 голосов
/ 07 сентября 2018

Автор вопроса говорит, что ответ D, но мне интересно, почему ответ не должен быть C ??

В: Какое утверждение верно в отношении кода, который может заполнить пробел?

class Sticker {
  public int hashCode() {
    return 1;
  }
  public boolean equals(Object o) {
    return____________ ;
 }
}

A. Должен вернуть false.
Б. Он должен вернуть истину.
C. Он может вернуть либо true, либо false.
D. Ничего из перечисленного.


РЕДАКТИРОВАТЬ 1 :

Ответ и объяснение, данное автором, следующие: Если два экземпляра класса имеют одинаковый хеш-код, они могут быть или не быть равными. Обратное неверно. Если два объекта равны, они должны иметь один и тот же хэш-код, чтобы соответствовать контрактам этих методов. Однако в этом случае ответ не один из вышеперечисленных, потому что метод не может просто вернуть истину или ложь. На основании правил equals (), если передается значение null, результат должен быть ложным. Если передается идентификация объекта, результат должен быть истинным из-за рефлексивности. В результате, вариант D. является правильным.


РЕДАКТИРОВАТЬ 2 : Может быть, автор имеет в виду следующее объяснение, приведенное выше: Я думаю, что, возможно, автор хочет сказать, что если мы вернем true из equals(Object), то есть вероятность, что кто-то может передать null в equals(Object), и в этом случае это будет противоречить возвращаемому значению true как на основе null передаваемого аргумента, возвращаемое значение должно быть false, а не true. Точно так же, если мы вернем false, тогда есть вероятность, что идентификатор объекта Sticker будет передан, и тогда это снова будет противоречить. Так что в принципе мы не можем заполнить пробел либо true, либо false. Возможно, именно поэтому автор сказал, что ответ был D.

1 Ответ

0 голосов
/ 07 сентября 2018

Автор плохо написал варианты ответа. Из их объяснения ясно, что их варианты ответа лучше записать как:

A. Он всегда должен возвращать false. Б. Это всегда должно возвращать истину. C. Возвращение true или возвращение false всегда оба правильны. D. Ничего из перечисленного.

Вопрос может также выиграть от переписывания:

Предполагая, что код, который заполняет пробел, правильно выполняет контракт метода equals (), какое утверждение ниже всегда верно?

Автор совершил два тяжких нарушения против компьютерных наук

  1. Нарушение ключевого слова . «Return» - это ключевое слово, и колоссально глупо использовать «return», когда вы действительно имеете в виду «верный возврат». Предложение = должен попытаться объяснить логику указателя первокурснику из 300 человек Именно это нарушение делает его настолько непостижимым, поскольку булева функция может явно возвращать истину или ложь.
  2. Нарушение логической логики . Логическое значение может быть истинным или ложным. Следовательно, функция, возвращающая логическое значение, может либо всегда возвращать true, всегда возвращать false, либо иногда возвращать одно, а иногда и другое. Чтобы дать 4 варианта ответа на булеву проблему, это нарушение природы булевых. Это нарушение усугубляется злоупотреблением ключевым словом «возврат», но само по себе это должно быть преступлением. Предложение = парная программа на C ++ с стажером, чьим единственным образованием по CS является учебный лагерь React
...