«Внутреннее» ключевое слово Котлина для взаимодействия с Java

#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 декларациях, поэтому не так уж сложно (хотя я думаю, что формулировку можно было бы улучшить) интерпретировать «члены внутренних классов» как » внутренние члены внутренних классов». Во всяком случае, это то, что на самом деле искалечено.