Как получить доступ к константам, определенным в интерфейсе java из интерфейса kotlin - PullRequest
0 голосов
/ 27 января 2020

Почему доступ к константам, определенным в интерфейсе java, из интерфейса kotlin не разрешен или, по крайней мере, я не могу получить к нему доступ. Есть ли другой способ?

(Да, я знаю, постоянный шаблон интерфейса - это плохое использование интерфейсов из книги Effective Java)

Следующий код (java) компилирует

// ==== JSubsystem.java ====

public interface JSubsystem {
    String IRIS = "IRIS";
    String TCS = "TCS";
    // ...
}

// ==== JComponentType.java ====
public interface JComponentType {
    String HCD = "HCD";
    String Assembly = "Assembly";
    // ...
}

interface Demo extends JSubsystem {
    default void foo() {
        System.out.println(IRIS);
    }
}

Но в следующем kotlin интерфейсе, который расширяется от java, IRIS | TCS | HCD недоступен

// ==== AllModels.kt ====

interface AllModels : JSubsystem, JComponentType {
    fun foo() = println(IRIS)
}

Подробнее о том, почему мы оказались в такой ситуации:

У нас есть большая scala кодовая база, все модели обеспечивают java и scala доступ.

Теперь у нас есть требование сценариев для 1-5% наших пользователей, где мы использовали kotlin скрипты (.kts), dsl, сопрограммы и функции приостановки

Мы предоставили script конструкцию, внутри которой пользователи будут иметь доступ к полной DSL и всем моделям .

Мы не хотим, чтобы пользователи явно импортировали модели из разных файлов, и мы не хотим повторять определение моделей снова в kotlin.

Одно из решений, которое, по нашему мнению, могло бы работать в этом кейс имеет java моделей (это просто e делегируются моделям scala) и затем имеют один интерфейс на стороне kotlin, который простирается от всех этих интерфейсов java модели, и тогда script может составлять receiver этого интерфейса - AllModels

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Вам необходимо явно указать интерфейс:

fun foo() = println(JSubsystem.IRIS)

Или вы можете импортировать константу явно:

import your.package.name.JSubsystem.IRIS

2 голосов
/ 28 января 2020

Вы можете настроить среду сценария, как описано в https://github.com/Kotlin/KEEP/blob/master/proposals/scripting-support.md, в частности, вы можете добавить импорт, который будет автоматически доступен с defaultImports.

Этот пример в дискуссионном форуме Kotlin должен быть полезен:

Во-первых, вам нужно создать определение скрипта - отдельную банку, которая описывает ваш «шаблон» скрипта, например: аналогично https://github.com/JetBrains/kotlin/tree/master/libraries/tools/kotlin-main-kts Ваше определение может выглядеть примерно так:

@KotlinScript(fileExtension = "custom.ext", compilationConfiguration = ScriptConfiguration::class)
abstract class MyScript(val bindings: Map<String, Any?>) {
    val ortResult = bindings["ortResult"] as OrtResult
    val evalErrors = mutableListOf<OrtIssue>()
}

object ScriptConfiguration : ScriptCompilationConfiguration(
    {
        defaultImports("com.here.ort.model.*", "java.util.*")
        ide {
            acceptedLocations(ScriptAcceptedLocation.Everywhere)
        }
    })

Хорошей идеей будет иметь выделенное расширение для ваших сценариев (в данном случае «custom.ext») выше), поскольку IDE различает guish сценариев по расширению.

Затем вам нужно будет создать собственную фабрику JSR-223 так же, как здесь - https://github.com/JetBrains/kotlin/blob/master/libraries/tools/kotlin-script-util/src/main/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223ScriptEngineFactoryExamples.kt#L28, но используйте ваше определение сценария (MyScript) вместо KotlinStandardJsr223ScriptTemplate. Вы, вероятно, можете сделать это в той же банке. И вам, конечно, нужно зарегистрировать его в папке служб.

Вам все равно понадобится часть постфайла в оценщике, но она не относится к IDE.

Тогда, наконец, Вы должны предоставить Intellij с определением. Простейший способ ad-ho c сделать это - указать FQN вашего класса определения вместе с classpath, необходимым для его загрузки в настройках компилятора kotlin -> «Kotlin scripting» в Intellij.

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