Ошибка Kotlin: публичная функция предоставляет свой аргумент типа public / * package * /. - PullRequest
0 голосов
/ 28 октября 2018

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

'public' function exposes its 'public/*package*/' return type argument FooSettings

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

Я провел некоторое исследование об общих дженериках Kotlin и использовании in или out, но не смог решить проблему.

Есть ли какая-нибудь работа, которую я могу сделать в своем проекте Kotlin, чтобы исправить ошибку, которую я вижу?

Фрагмент кода

Это пример класса библиотеки Java: Обратите внимание, у меня нет возможности изменить реализацию библиотеки. Я должен использовать эту библиотеку и расширить ее в Kotlin.

Мне кажется странным, что библиотека java написана таким образом и ожидает, что она будет переопределена, но это вопрос для другого дня.

import java.util.Collections;
import java.util.List;

public abstract class ClassA {
    public List<FooBuilder<?>> getBuilder(Foo foo) {
        return Collections.emptyList();
    }
}

public class Foo {
}

public abstract class FooBuilder<U extends FooBuilder.FooSettings> {
    // implementation of Class
    abstract static class FooSettings {
        // implementation of Class
    }
}

Обычно классы Java переопределяют метод следующим образом:

import java.util.List;

public class MyJavaClassA extends ClassA {
    @Override public List<FooBuilder<?>> getBuilder(final Foo foo) {
        // implementation
    }
}

Но я пытаюсь писать на Kotlin так, чтобы это выглядело как : Напомним, что этот Kotlin зависит от библиотеки Java и не имеет доступа к открытым классам пакета.

class MyKotlinClassA : ClassA() {
    override fun getBuilder(foo: Foo): MutableList<FooBuilder<*>> {
        // implementation
    }
}

Это вызывает ошибку

'public' function exposes its 'public/*package*/' return type argument FooSettings

1 Ответ

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

Я полагаю, что под "package public" вы подразумевали "package private"?В вашем примере FooBuilder.FooSettings не имеет модификатора видимости, поэтому использует Java по умолчанию для пакета private.Предполагая, что вы это имели в виду ...

Вы сможете получить доступ к закрытому классу пакета FooSettings в своем коде Kotlin, но только если вы поместите этот код Kotlin в пакет, соответствующий тому, где FooSettings объявлено.

Вы по-прежнему получите ту же ошибку компиляции, но это не потому, что вы не можете получить доступ к типу: это потому, что вы пытаетесь использовать его в контексте, который более заметен, чемобъявление типа.то есть вы пытаетесь взять пакет закрытого типа и использовать его как часть подписи открытого метода, что недопустимо.Чтобы обойти эту проблему, вам нужно пометить свой класс Kotlin как internal.

Также стоит упомянуть, что internal для Kotlin означает, что он виден в этом модуле , а не вэтот пакет .Все это объясняется более подробно здесь .

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