Таким образом, формулировка проблемы такова, как она говорит. Я хочу переопределить поведение equals в строковом классе в определенном пакете.
Я огляделся, и в основном кажется, что нет никакого способа сделать это.
Самое близкое, что я получил к определению метода в существующем классе, было следующим:
implicit class StringImprovements(s: String) {
def increment = s.map(c => (c + 1).toChar)
}
а затем используйте его так -
"HAL".increment
Что, честно говоря, удивительно. Но затем я попытался переопределить равенство, используя тот же подход, это не сработало. Я осмотрелся и нашел этот вопрос от 2015 года - переопределить библиотечный метод с помощью Scala Implicit
Цитируя строку из вышеупомянутого вопроса -
Implicits are used if scala compiler cannot find method without it, so you can`t override methods with implicits
Но учитывая, что релизы Scala очень часты и все постоянно меняется, мне было интересно, возможно ли это сделать сейчас, с помощью этого или любого другого средства.
Заранее спасибо!
@Thilo Кажется, мне не следовало использовать слово «везде в моем проекте». Это вводит в заблуждение, извините за путаницу, я отредактировал его на «конкретные пакеты». Итак, в основном «весь мой код»
Ну, вы не можете этого сделать. Вы должны либо выбрать другое имя метода, либо поместить String в свой собственный тип MySpecialString
, на котором вы затем можете определить equals
(и hashCode
) по своему вкусу.
Нет, это невозможно. И если бы это было так, я бы ожидал, что много библиотечного кода сломается, потому что он ожидал нормального поведения от String#equals
!
Я не говорю о том, что поведение String equals меняется везде, только в пределах пакетов, которые я указываю, где я должен специально импортировать конкретный неявный класс. Так что код библиотеки никогда не сломается. Верно? Пожалуйста, поправьте меня, если я ошибаюсь
Кажется, я не должен был использовать слово «везде в моем проекте». Это вводит в заблуждение, извините за путаницу, я отредактировал его на «конкретные пакеты». Итак, в основном «весь мой код»
Это все равно было бы очень странно. Когда вы используете строки в качестве ключей карты или членов набора, вы ожидаете, что они будут использовать ваше равенство или стандартное? Что делать, если карта возвращается из библиотечного метода? Как говорится в комментарии Тило, имеет смысл вместо этого определить свой отдельный тип (и, возможно, добавить неявные преобразования в и/или из String
).
Даже если бы это было возможно, вы могли бы переопределить String#equals только для своего собственного кода (потому что он должен использовать ваш неявный код). Все остальное, что уже скомпилировано против «обычной» строки, не будет затронуто, и результат будет чрезвычайно запутанным, особенно с таким основным методом.