#kotlin #kotlin-java-interop
Вопрос:
Я пытаюсь понять, что происходит с внутренними классами, когда их рассматривают с точки зрения Java.
Нашел это в документах:
Члены внутренних классов подвергаются искажению имен, чтобы затруднить их случайное использование из Java и разрешить перегрузку для участников с одинаковой подписью, которые не видят друг друга в соответствии с правилами Kotlin
Поэтому мне было очень любопытно посмотреть, как это выглядит на практике.
Я создал простой класс Kotlin:
internal class Foo(i : Int) {}
Создал проект, распаковал банку и использовал javap, чтобы взглянуть на реальный класс… и он отобразил стандартный общедоступный класс с оригинальным именем:
Compiled from "Foo.kt"
public final class Foo {
public Foo(int);
}
Я что-то упускаю? или это просто документы, которые вводят в заблуждение?
В документах упоминаются члены внутренних классов, но я пробовал и это:
internal class Foo(someInt : Int) {
var someString : String
get() {
TODO()
}
set(value) {}
fun foo() { }
class Bar { }
}
И получил ожидаемый результат:
Compiled from "Foo.kt"
public final class Foo {
public Foo(int);
public final java.lang.String getSomeString();
public final void setSomeString(java.lang.String);
public final void foo();
}
и:
Compiled from "Foo.kt"
public final class Foo$Bar {
public Foo$Bar();
}
Комментарии:
1. В цитате говорится » члены внутренних классов…». У вашего внутреннего класса нет членов.
2. Там должно было быть написано »
internal
члены классов проходят через искажение имен…», потому что это то, что я вижу. Кажется, не имеет значения, является ли классpublic
илиinternal
.3. @Sweeper Хорошая заметка. Я постараюсь играть дальше и стану свидетелем искажения имени
4. @Sweeper попробовал, не получилось, обновил вопрос
5. Прочтите мой комментарий еще раз, пожалуйста. Я сказал »
internal
члены». Объявления без модификаторов по умолчанию являются общедоступными. Вы как бы опустили некоторый контекст из документации в своей цитате. Весь этот абзац говорит оinternal
декларациях, поэтому не так уж сложно (хотя я думаю, что формулировку можно было бы улучшить) интерпретировать «члены внутренних классов» как » внутренние члены внутренних классов». Во всяком случае, это то, что на самом деле искалечено.