首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从kotlin接口访问java接口中定义的常量

如何从kotlin接口访问java接口中定义的常量
EN

Stack Overflow用户
提问于 2020-01-27 10:56:56
回答 2查看 322关注 0票数 0

为什么不允许从kotlin接口访问java接口中定义的常量,或者至少不能访问它。还有别的办法吗?

(是的,我知道常量接口模式很难使用有效Java书中的接口)

下面的代码(java)编译

代码语言:javascript
复制
// ==== 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);
    }
}

但是在以下扩展自java的kotlin接口中,无法访问IRIS\\TCS/TCS\HCD。

代码语言:javascript
复制
// ==== AllModels.kt ====

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

更多关于我们为什么在这种情况下结束的背景:

我们有一个大型的scala代码库,所有的模型都提供javascala访问。

现在,我们已经为1-5%的用户提供了脚本需求,我们已经使用了kotlin的脚本(.kts)、dsl、coroutines和悬置功能。

我们提供了script结构,用户可以在其中访问完整的DSL和所有模型。

我们不希望用户显式地从不同的文件导入模型,也不希望在kotlin中重复定义模型。

我们认为在这种情况下可以使用的解决方案之一是在接口中拥有java模型(这些是对scala模型的简单委托),然后在kotlin端有一个接口,从所有这些java模型接口扩展而来,然后script可以是这个接口的receiver - AllModels

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-27 21:29:18

您可以像https://github.com/Kotlin/KEEP/blob/master/proposals/scripting-support.md中所描述的那样自定义脚本环境,特别是可以添加defaultImports将自动提供的导入。

在Kotlin论坛上的这个例子应该是有帮助的:

首先,您需要创建一个脚本定义--一个单独的jar来描述您的脚本“模板”,例如,您的定义可能类似于https://github.com/JetBrains/kotlin/tree/master/libraries/tools/kotlin-main-kts: @KotlinScript(fileExtension = "custom.ext",compilationConfiguration = ScriptConfiguration:: class )抽象类MyScript(val绑定: Map) { val ortResult =绑定“OrtResult”作为OrtResult val evalErrors = mutableListOf()对象ScriptConfiguration : ScriptCompilationConfiguration( { defaultImports("com.here.ort.model.*","java.util.*") ide {custom.ext} }) 为您的脚本设置一个专用的扩展(上面示例中的“custom.ext”)是个好主意,因为IDE通过扩展来区分脚本。 然后,您需要创建自己的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。你可能可以在同一个罐子里做。当然,您需要在“服务”文件夹中注册它。 不过,您仍然需要在评估器中添加一个part部分,但它似乎与IDE无关。 最后,您需要为Intellij提供定义。最简单的临时方法是指定定义类的FQN以及在Intellij中的kotlin编译器设置中加载它所需的类路径->“Kotlin脚本”。

票数 2
EN

Stack Overflow用户

发布于 2020-01-27 11:29:26

您需要显式地指定接口:

fun foo() = println(JSubsystem.IRIS)

或者可以显式导入常量:

import your.package.name.JSubsystem.IRIS

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59929763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档