Я изучаю Kotlin и читаю в эти дни Kotlin в действии .Читая главу о функциях расширения и улучшении стандартной библиотеки, я читал о различном поведении, вызванном перегрузками String.split
между Java и Kotlin: я думаю, что это очень хорошая идея, чтобы перейти к явному и более управляемому разделению между разделителями на основе иПерегрузки на основе регулярных выражений.
Об этом в упомянутой выше книге сказано, что Kotlin скрывает запутанный метод и предоставляет в качестве замены несколько перегруженных расширений с именем split
, которые имеют разные аргументы .
Функции расширения отвечают на вопрос «Как добавить метод в существующий класс»;с другой стороны, Я не могу понять, как можно скрыть методы, предоставляемые стандартной библиотекой Java .
Я пытался написать простой код,и я заметил, что
val ks = "Pietro Martinelli"
имеет ks::class.qualifiedName == "kotlin.String"
val ks = "Pietro Martinelli"
имеет ks::javaClass.name == "java.lang.String"
- , передавая указанное выше значение
ks
в метод Javaполученный параметр x
имеет x.getClass().getName() == "java.lang.String"
(как и ожидалось) String js = "Pietro Martinelli"
(в коде Java) имеет js.getClass().getName() == "java.lang.String"
, как и ожидалось - , передавая указанное выше значение
js
вПо методу Котлина, полученный параметр y
имеет y::class.qualifiedName == "kotlin.String"
и y.getClass().getName() == "java.lang.String"
(как и ожидалось)
Итак: кажется, что (позвольте мне сказать) что-то волшебное произошло, когда я использую String
значений в Kotlin и обратно от Kotlin до Java.Если я правильно понимаю, литералы String
в Kotlin являются экземплярами kotlin.String
, но они ограничены типом Java , который прозрачно используется для вызовов методов Java.Таким образом, библиотека Kotlin может улучшить работу String
, не затрагивая java.lang.String
: обычные методы Java [java.lang.]String.split
скрыты для кода Kotlin в том смысле, что разработчики Kotlin видят [kotlin.]String
экземпляры и их методы.
Итак, два (связанных) вопроса: 1. верно ли мое понимание?И, что более интересно, 2. это всего лишь разновидность магии, созданная компилятором, который знает String
s как экземпляры специального типа и заключает их в экземплярыдругой класс, или есть какой-то более общий подход / механика, которая позволяет каким-то образом скрыть некоторый метод класса так же, как мы можем добавлять методы через механику функции расширения?Это может быть очень опасно, поэтому Я думаю, что это только вопрос компилятора , но он также может быть мощным, поэтому я думаю, что это стоит вопроса.
Заранее благодарен за подсказкии отзывы.