Есть ли способ скрыть методы Java в Kotlin? - PullRequest
0 голосов
/ 18 февраля 2019

Я изучаю Kotlin и читаю в эти дни Kotlin в действии .Читая главу о функциях расширения и улучшении стандартной библиотеки, я читал о различном поведении, вызванном перегрузками String.split между Java и Kotlin: я думаю, что это очень хорошая идея, чтобы перейти к явному и более управляемому разделению между разделителями на основе иПерегрузки на основе регулярных выражений.

Об этом в упомянутой выше книге сказано, что Kotlin скрывает запутанный метод и предоставляет в качестве замены несколько перегруженных расширений с именем split, которые имеют разные аргументы .

Функции расширения отвечают на вопрос «Как добавить метод в существующий класс»;с другой стороны, Я не могу понять, как можно скрыть методы, предоставляемые стандартной библиотекой Java .

Я пытался написать простой код,и я заметил, что

  1. val ks = "Pietro Martinelli" имеет ks::class.qualifiedName == "kotlin.String"
  2. val ks = "Pietro Martinelli" имеет ks::javaClass.name == "java.lang.String"
  3. , передавая указанное выше значение ks в метод Javaполученный параметр x имеет x.getClass().getName() == "java.lang.String" (как и ожидалось)
  4. String js = "Pietro Martinelli" (в коде Java) имеет js.getClass().getName() == "java.lang.String", как и ожидалось
  5. , передавая указанное выше значение 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 как экземпляры специального типа и заключает их в экземплярыдругой класс, или есть какой-то более общий подход / механика, которая позволяет каким-то образом скрыть некоторый метод класса так же, как мы можем добавлять методы через механику функции расширения?Это может быть очень опасно, поэтому Я думаю, что это только вопрос компилятора , но он также может быть мощным, поэтому я думаю, что это стоит вопроса.

Заранее благодарен за подсказкии отзывы.

1 Ответ

0 голосов
/ 18 февраля 2019

К сожалению, это магия компилятора.Они называются сопоставленные типы , и компилятор предоставляет им специальную обработку, чтобы сделать их видимыми для кода Kotlin как типы Kotlin, которые имеют измененные интерфейсы, хотя во время выполнения они являются экземплярами обычной Javaтипы при компиляции в JVM.

Кроме String, наиболее примечательными примерами, возможно, являются коллекции, к которым применены два уровня совершенно новых интерфейсов для только для чтения и изменяемых вариантов.

...