Неожиданный результат при сравнении возвращаемого значения CharSequence.reversed ()

aboulfazl, поскольку методы PHP 5.3.3 с тем же именем, что и класс, не будут рассматриваться как конструктор!

    YourClass
    {
        public $any = false;

        public function __construct($any = null)
        {
            $this->any = (is_null($any) ? $this->any : $any);
        }
    }

Это работает, но не спрашивает владелец темы, Джон дает awnser!

0
задан andrei 17 January 2019 в 12:37
поделиться

1 ответ

Обратите внимание, что вы, вероятно, смущены тем, что показано в toString и как равенство (equals) ведет себя.

То, что вы видите, является результатом toString(). Любой тип может решить, как может выглядеть его строковое представление, переопределив этот метод. Это, однако, не влияет на то, как объекты этого типа сравниваются друг с другом. Вот где появляется equals (в некоторых случаях также compare).

Другие писали что-то о том, что базовый тип сравниваемых объектов не равен (одна сторона StringBuilder и другая String). Однако актуальной проблемой является equals -метод. Возможно (обычно это не делается по разным причинам), что equals для определенного типа поддерживает равенство различных типов объектов (такое поведение (должно быть) должно быть упомянуто в интерфейсе по крайней мере). Если ничего не указано, можно предположить, что выполняется равенство по умолчанию из Object.equals .

В этом случае, однако, CharSequence -javadoc уже заявляет следующее о равенстве (выделено мое):

Этот интерфейс не уточняет общие контракты [ 1111] и hashCode методы. Результат проверки двух объектов, которые реализуют CharSequence на равенство, поэтому, как правило, не определен . Каждый объект может быть реализован отдельным классом, и нет никакой гарантии, что каждый класс сможет проверить свои экземпляры на равенство с другими. Поэтому нецелесообразно использовать произвольные экземпляры CharSequence в качестве элементов в наборе или в качестве ключей на карте.

Подводя итог: забудьте, что вы получили String или StringBuilder из subSequence и reversed. Контракт метода указывает CharSequence, и поэтому вы должны обрабатывать его как CharSequence. Нет гарантии, что эти функции все равно будут возвращать String или StringBuilder в будущем.

0
ответ дан Roland 17 January 2019 в 12:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: