Java-класс, расширяющий базовый класс Kotlin, не может вызывать внутренние методы base - PullRequest
0 голосов
/ 19 октября 2018

Я экспериментирую с Kotlin на Android, на Android Studio, смешиваю его с некоторым существующим Java-кодом, и я столкнулся с проблемой.

У меня есть базовый класс в Kotlin с одним помеченным методомкак internal:

package com.example.kotlin.hellokotlin

open class KotlinBaseClass
{
    internal fun doSomething()
    {
        println("Done something!")
    }
}

Затем я создаю класс Kotlin, который расширяет KotlinBaseClass и вызывает метод базового класса:

package com.example.kotlin.hellokotlin

class KotlinDerivedClass : BaseClass()
{
    fun doSomethingElse()
    {
        doSomething()
        println("Done something else!")
    }
}

Это компилируется и работает нормально.

Если я сейчас создам Java-класс, который расширяет KotlinBaseClass, вместо этого он должен быть функционально идентичен KotlinDerivedClass:

package com.example.kotlin.hellokotlin;

public class JavaDerivedClass extends KotlinBaseClass
{
    public void doSomethingElse()
    {
        doSomething();
        System.out.println("Done something else!");
    }
}

, я обнаружу, что этот класс не будет компилироваться, потому что метод doSomething() не может быть решен.Если я уберу ключевое слово internal из объявления doSomething() в KotlinBaseClass, все будет работать.Все классы определены в одном пакете.

Это ожидаемое поведение?Известная проблема с совместимостью между Java и Kotlin?

1 Ответ

0 голосов
/ 19 октября 2018

Объект с именем объясняется здесь в https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html

. Внутренние объявления становятся открытыми в Java.Члены внутренних классов проходят через искажение имен, чтобы затруднить их случайное использование из Java и разрешить перегрузку для членов с одинаковой подписью, которые не видят друг друга в соответствии с правилами Kotlin;

В вашем классе Java вы сможете найти имя, набрав первые несколько символов, а затем alt + space, чтобы получить автозаполнение.Полное имя функции в вашем классе Java: doSomething$nameOfYourModule

В качестве альтернативы вы можете установить doSomething на protected и получить к нему доступ по обычному имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...