Хотя комментарии о переименовании метода заслуживают внимания, я продолжал пытаться не допустить компиляции неправильного кода и смог достичь компромисса, который может быть обобщен для других возможных столкновений символов в будущем.
Во-первых, чтобы запутать компилятор, к объекту добавлен очень похожий метод:
@Deprecated(level = DeprecationLevel.ERROR,
message = "This is not the method you are looking for (waves hand)",
replaceWith = ReplaceWith("runOrQueue()"))
fun <T, R> run(block: T.() -> R): R {
TODO("Don't use this")
}
Это не совсем то же самое, что и стандартная библиотекаrun()
, поэтому, когда вы начинаете печатать в IDE, вы по-прежнему получаете одно предложение для стандартной библиотеки, а другое - для метода объекта.К счастью, даже если используется версия автозаполнения, так как есть два очень похожих метода run()
, компилятор будет жаловаться на неоднозначность.
Фактически, после добавления этого метода и восстановления исходного кода, компилятор поймал дваЕще несколько случаев ошибки:
e: PasswordPresenter.kt: (181, 49): Using 'run(T.() -> R): R' is an error. This is not the method you are looking for (waves hand)
e: PasswordPresenter.kt: (181, 49): Type inference failed: Not enough information to infer parameter T in fun <T, R> run(block: T.() -> R): R
Please specify it explicitly.
e: PasswordPresenter.kt: (258, 33): Using 'run(T.() -> R): R' is an error. This is not the method you are looking for (waves hand)
e: PasswordPresenter.kt: (258, 33): Type inference failed: Not enough information to infer parameter T in fun <T, R> run(block: T.() -> R): R
Please specify it explicitly.
Не самая красивая в мире, но она подходит ближе и выполняет свою работу.Или, как сказала бы Салли Амаки, притворяйся, пока не сделаешь .